自定义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));
}

自定义SynchronizationContext设置线程.在unittest中异步运行CurrentPrincipal

检查

等待SetCurrentPrincipalAsync ();

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