gpt4 book ai didi

c# - 自定义SynchronizationContext在unittest中异步设置Thread.CurrentPrincipal

转载 作者:行者123 更新时间:2023-11-30 17:41:33 25 4
gpt4 key购买 nike

这个问题类似于Set Thread.CurrentPrincipal Asynchronously? .然而,在我的例子中,我试图让它在单元测试中工作,并希望通过自定义 SynchronizationContext 来解决这个问题。

是否有一个 SynchronizationContext 的行为类似于 ASP.NET 使用的 SynchronizationContext,但它可以被单元测试使用? (我的代码在 ASP.NET 中运行得非常好。)

特别是,正是 AspNetSynchronizationContext 的特性使主体能够从我想要的异步方法中“冒出”。

当 SetCurrentPrincipalAsync 方法(如下)在 asp.net 应用程序/上下文中被调用时,Thread.CurrentPrincipal 不会被调用方法覆盖。 - 但是当测试运行时,它会失败。

[Fact]
public async Task SetSynchronizationContext()
{
//SynchronizationContext.SetSynchronizationContext(new SomeCustomSynchronizationContext());
await SetCurrentPrincipalAsync();
Assert.Equal("Name", Thread.CurrentPrincipal.Identity.Name);
}

static async Task SetCurrentPrincipalAsync()
{
var principal = new GenericPrincipal(new GenericIdentity("Name"), new []{"Role"});
Thread.CurrentPrincipal = principal;
if (HttpContext.Current != null)
HttpContext.Current.User = principal;
await Task.Delay(TimeSpan.FromSeconds(1));
}

最佳答案

检查是否在

之后

等待 SetCurrentPrincipalAsync();

线程没有改变,因为如果 SynchronizationContext.Current == null(默认情况下它等于 null,除了 UI 线程等),await 执行后将在任何可用的线程池线程中继续。另一个建议,用模拟对象更改所有系统类,如 HttpContext,测试你的代码而不是系统 ;)

关于c# - 自定义SynchronizationContext在unittest中异步设置Thread.CurrentPrincipal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32797163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com