自定义SynchronizationContext设置线程.在unittest中异步运行CurrentPrincipal
本文关键字:异步 运行 CurrentPrincipal unittest SynchronizationContext 设置 线程 自定义 | 更新日期: 2023-09-27 18:14:34
这个问题类似于设置线程。异步CurrentPrincipal ?。然而,在我的情况下,我试图让它在单元测试中工作,并希望通过自定义SynchronizationContext解决这个问题。
是否有一个SynchronizationContext的行为类似于ASP使用的。NET,但它可以用于单元测试?(我的代码在ASP.NET中工作得很好。)
特别地,它是AspNetSynchronizationContext的特性,它使主体能够从我想要的异步方法中"弹出"。
当方法SetCurrentPrincipalAsync(下面)在asp.net应用程序/上下文中被调用时,当前委托人不会被调用方法覆盖。—但是当测试运行时,它将失败。
[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,测试您的代码而不是系统;)