此問題與Set Thread.CurrentPrincipal Asynchronously?類似。然而,在我的情況下,我試圖讓這個工作在單元測試,並希望通過自定義SynchronizationContext解決這個問題。Custom SynchronizationContext在unittest中異步設置Thread.CurrentPrincipal
是否有一個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));
}