2010-05-05 97 views
1

使用NUnit和Moq,我試圖圍繞遺留代碼進行一些測試,然後再做更多的重構。我需要測試一個方法是否保持循環,直到告訴停止。這是我的想法該怎麼做:這是一個很好的方式來設置Moq返回一個特定的值只有一定的次數?

[TestCase] 
public void KeepsCallingDoSomethingUntilShouldIKeepGoingIsFalse() 
{ 
    var dal = new Mock<IDataAccessLayer>(); 
    var sut = new MyService(dal.Object); 
    int numberOfTimesToReturnTrue = 5; 
    dal.Setup(x => x.ShouldIKeepGoing()) 
     .Callback(() => numberOfTimesToReturnTrue--) 
     .Returns(() => numberOfTimesToReturnTrue >= 0); 

    sut.Blah(); 

    dal.Verify(x => x.DoSomething(), Times.Exactly(5)); 
} 

這個測試很難理解嗎?這是一個有效/乾淨的方式來做到這一點?有沒有更好的辦法?關於用這種方式編寫測試的一些問題讓我感到困惑。

回答

1

我想我會做這樣的事情:

const int max = 5; 
var callCount = 0; 
_dal.Setup(x => x.ShouldIKeepGoing()) 
    .Returns(()=> ++callCount <= max) 
    .AtMost(max+1); 

犀牛製品有記錄,以便每個預期的調用,然後重播一系列調用的能力。

+0

我似乎無法在Moq 3.1.416中以這種方式進行AtMost調用。這是4.0測試版嗎? 但我認爲它沒有回調就更清潔,即使我必須在我的驗證中指定時間。 謝謝。 – JohnRudolfLewis 2010-05-06 16:55:03

+0

我們正在使用4.0.812.4。 – Mark 2010-05-06 20:03:05

相關問題