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。
我怎樣才能斷言這個方法是用指定的參數調用的,但它調用的頻率應該沒有關係。當對方法的調用之一與指定的參數匹配時,斷言不會失敗。
好吧,這意味着我應該在這種情況下使用「真正的」ChimeManager,而不是一個模擬的,然後斷言ChimeManagers配置。嗯,因爲它是一個注入依賴我認爲我應該嘲笑它,但我喜歡這種新方法。謝謝 – leozilla