自定义SynchronizationContext在单元测试中异步设置Thread.CurrentPrincipal

3
这个问题类似于如何异步设置Thread.CurrentPrincipal。但是,在我的情况下,我正在尝试在单元测试中使其工作,并希望通过自定义SynchronizationContext解决此问题。
是否有一个类似于ASP.NET使用的SynchronizationContext,但可用于单元测试?(我的代码在ASP.NET中完美运行。)
特别是,我想要AspNetSynchronizationContext的一项功能,即允许主体从异步方法“冒泡”出来。
当在asp.net应用程序/上下文中调用SetCurrentPrincipalAsync方法时,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));
}
1个回答

1

检查在

await SetCurrentPrincipalAsync();

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接