这个问题类似于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/