繁体   English   中英

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

[英]Custom SynchronizationContext to set Thread.CurrentPrincipal asynchronously in unittest

这个问题类似于Set Thread.CurrentPrincipal异步? 但是,在我的情况下,我试图让它在单元测试中工作 ,并希望通过自定义SynchronizationContext解决这个问题。

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

特别是,它是AspNetSynchronizationContext的一个特性,它使一个主体能够“摆脱”我想要的异步方法。

当在asp.net应用程序/上下文中调用方法SetCurrentPrincipalAsync(bellow)时,调用方法不会覆盖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线程等)将继续在任何可用的线程池线程中。 另一个建议,改变所有系统类,如HttpContext,使用模拟对象,测试代码而不是系统;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM