一千萬個為什麽

搜索

這是設置Moq僅返回特定值的特定次數的好方法嗎?

使用NUnit和Moq,我嘗試在遺留代碼中包含一些測試,然後再進行更多的重構。我需要測試一個方法保持循環,直到被告知停止。這是我的想法如何做到這一點:

[TestCase]
public void KeepsCallingDoSomethingUntilShouldIKeepGoingIsFalse()
{
   var dal = new Mock();
   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));
}

這個測試難以理解嗎?這是一種有效/幹凈的方式嗎?有沒有更好的辦法?關於以這種方式編寫測試的東西讓我感到困惑。

最佳答案

我想我會做這樣的事情:

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

Rhino Mocks能夠按順序記錄每個預期的呼叫,然後重播該系列的呼叫。

轉載註明原文: 這是設置Moq僅返回特定值的特定次數的好方法嗎?