2015-09-26 63 views
3

此問題與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)); 
} 

回答

1

檢查後

等待SetCurrentPrincipalAsync();

線程沒有改變,因爲如果在等待執行後SynchronizationContext.Current == null(並且默認情況下它的等於null,除了UI線程等)將繼續在任何可用的線程池線程中。 另一個建議是,使用模擬對象更改所有系統類,如HttpContext,測試您的代碼而不是系統;)

相關問題