2016-02-11 157 views
0

有時候,我需要進行不同的設置()調用不同的每次測試運行設置嘲弄 - 就像這樣:單元測試,並在我的測試嘲笑爲每個測試

private void Setup(bool isTrue) 
{ 
    mock.Setup(x => x.DisplayNames).Returns(new Dictionary<int, string>()); 
    // ... 
    // 5x more of these are the same for all tests 

    if (isTrue) 
     mock.Setup(x => x.DisplayOld).Returns(isTrue); 
     // 5x more of these parameterlized setups 
     ... 
} 

現在,在我的每一個單元測試我會打電話給安裝程序(true/false)。

由於單元測試並行運行(默認的xUnit),這將造成任何鎖定的問題? (假設兩個測試同時調用Setup())。

如果是這樣的話:

  1. 如何改變這種狀況?
  2. 如果想要使用傳遞參數的單個方法(如setup()) - 適用於不同的嘲諷場景,那麼正確的方法是什麼?
+0

如果你的'Setup'方法被你的單元測試框架自動調用,那麼是的,你將會遇到問題。如果它實際上是由你的測試調用的,那麼它應該沒問題,假設A)模擬對象沒有被靜態存儲(例如,在一個對象工廠中),B),模擬對象沒有使用共享功能進行設置(例如:'.Returns(myDictionarySharedBetweenTests)'。 – Rob

+0

Rob,請您澄清一下嗎?是的,我從我的每個測試[Fact]方法調用setup(),它是一個簡單的設置,就像上面的代碼中那樣什麼是共享的基於布爾標誌前只要設置不同的情景:mock.Setup(X => x.DoSomething).Returns(真)/假等 – ShaneKm

回答

0

您需要使用參數化單元測試,可以使用xUnit測試框架的InlineData屬性。在這種情況下,模擬不需要在設置方法中設置。它可以直接在實際測試方法中設置。您的測試方法看起來就像下面

[Theory] 
[InlineData(false)] 
[InlineData(true)] 
public void SampleTest(bool flag) 
{ 
    .... //do any set up operations 
    .... //Assert logic to verify 
} 

測試框架將基於您與InlineData屬性提供輸入在運行時儘可能多的測試方法。由於測試方法在運行時被拆分爲不同的方法,因此您不會遇到任何鎖定或線程問題。

+0

這不是feasible..I將有一堆重複的代碼爲10X,起訂量設置和僅與參數的變化之一。 – ShaneKm

+0

這可能是仍有可能@ShaneKm,你可以在一個單獨的方法寫通用代碼和調用該方法從測試方法。 – Chris

0

檢查文章關於Test Context模式。您可以將mock作爲本地變量,並在測試上下文類中自定義它們的設置。然後平行運行它們是安全的。我在JUnit + Mockito中使用Java模式,在NUnit/MSTest + Moq中使用.Net模式。

+0

這仍然沒有解決設定M的問題ock(同樣的方式)10次,並根據參數設置不同的1次模擬。你最終得到10倍ctx.SomeMock.Setup() – ShaneKm

+0

通常我有一個像TestContext中的PerformDefaultSetup()方法。這樣我就不必在測試方法中重複相同的設置。 –