[英]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.