2011-08-06 56 views
1

我想測試下面的代碼:犀牛製品斷言,任何調用匹配預期的參數

foreach (CallQueueData queueData in _configurationProvider.CallQueues.Values) 
{ 
    _chimeManager.AddConfig(new ChimeConfigData(
     ChimeKey.Create(ChimeType.CallQueue, queueData.Name)); 

    if (queueData.LowChime != null) 
    { 
     _chimeManager.AddConfig(new ChimeConfigData(
      ChimeKey.Create(ChimeType.QueueLowChime, queueData.Name)); 
    } 

    if (queueData.HighChime != null) 
    { 
     _chimeManager.AddConfig(new ChimeConfigData(
      ChimeKey.Create(ChimeType.QueueHighChime, queueData.Name)); 
    } 
} 

我的一個測試是這樣的:

public void ShouldAddHighChimeConfigToChimeManager_IfServiceIsStarted_AndHighChimeIsConfigured() 
    { 
    // GIVEN 
    InitializeObjectUnderTestWithougStartingService(); 

    var callQueueData = new CallQueueData 
    { 
     Name = "Emergency", 
     HighChime = new ChimeType(1, "High") 
    }; 

    CallQueues.Add(callQueueData.Id, callQueueData); 

    // WHEN 
    _mgr.Startup(); 

    // THEN 
    ChimeManager.AssertWasCalled(x => x.AddConfig(Arg<ChimeConfigData>.Matches(
     y => y.Key == ChimeKey.Create(ChimeType.HighChime, callQueueData.Name)))); 
    } 

這裏的問題是,AddConfig方法的ChimeManager被多次調用 ,我不想指定在匹配我的方法之前多久調用一次。

// i dont like this repeat twice because this ties the test code to much to the production code 
ChimeManager.AssertWasCalled(x => x.AddConfig(Arg<ChimeConfigData>.Matches(
     y => y.Key == ChimeKey.Create(ChimeType.HighChime, callQueueData.Name)), 
     y => y.Repeat.Twice)); 

我寧願喜歡這樣說:

ChimeManager.AssertWasCalled(x => x.AddConfig(Arg<ChimeConfigData>.Matches(
     y => y.Key == ChimeKey.Create(ChimeType.HighChime, callQueueData.Name)), 
     y => y.Repeat.Any/y.Match.Any)); 

Unfortunatley Repeat.Any在這種情況下無效,任何沒有Match.Any。

我怎樣才能斷言這個方法是用指定的參數調用的,但它調用的頻率應該沒有關係。當對方法的調用之一與指定的參數匹配時,斷言不會失敗。

回答

2

寫一個測試來驗證方法的結果,而不是編寫一個測試來驗證方法的實現(隨着時間變得脆弱)。在這種情況下,它看起來像你想確保_chimeManager正確填充。

如果您編寫的測試只是發送一些數據,然後驗證結果,那麼您的單元測試將不太可能隨時間而中斷。假設在將來的某個時候,_chimeManager的總體會通過數據庫調用或除Add方法以外的其他方法發生?如果您針對實施編寫測試,您的測試將會中斷。但是,如果您編寫測試以確保在給定輸入的情況下正確填充了_chimeManager,那麼隨着「如何」更改,您的測試不會中斷。

+0

好吧,這意味着我應該在這種情況下使用「真正的」ChimeManager,而不是一個模擬的,然後斷言ChimeManagers配置。嗯,因爲它是一個注入依賴我認爲我應該嘲笑它,但我喜歡這種新方法。謝謝 – leozilla