SynchronizationContext

SynchronizationContext

这个问题类似于Set Thread.CurrentPrincipal Asynchronously?。但是,以我为例,我正在尝试使其在单元测试中起作用,并希望通过自定义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),测试代码而不是系统;)

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

10-11 11:58