这是设置Moq仅返回特定值的特定次数的好方法吗?

时间:2010-05-05 21:56:33

标签: c# tdd nunit moq unit-testing

使用NUnit和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 个答案:

答案 0 :(得分:1)

我想我会做这样的事情:

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

Rhino Mocks能够按顺序记录每个预期的呼叫,然后重播该系列的呼叫。