使用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));
}
这个测试难以理解吗?这是一种有效/干净的方式吗?有没有更好的办法?关于以这种方式编写测试的东西让我感到困惑。
答案 0 :(得分:1)
我想我会做这样的事情:
const int max = 5;
var callCount = 0;
_dal.Setup(x => x.ShouldIKeepGoing())
.Returns(()=> ++callCount <= max )
.AtMost(max+1);
Rhino Mocks能够按顺序记录每个预期的呼叫,然后重播该系列的呼叫。