这是一个很好的方式来设置Moq返回一个特定的值只有一定的次数?
问题描述:
使用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));
}
这个测试很难理解吗?这是一个有效/干净的方式来做到这一点?有没有更好的办法?关于用这种方式编写测试的一些问题让我感到困惑。
答
我想我会做这样的事情:
const int max = 5;
var callCount = 0;
_dal.Setup(x => x.ShouldIKeepGoing())
.Returns(()=> ++callCount <= max)
.AtMost(max+1);
犀牛制品有记录,以便每个预期的调用,然后重播一系列调用的能力。
我似乎无法在Moq 3.1.416中以这种方式进行AtMost调用。这是4.0测试版吗? 但我认为它没有回调就更清洁,即使我必须在我的验证中指定时间。 谢谢。 – JohnRudolfLewis 2010-05-06 16:55:03
我们正在使用4.0.812.4。 – Mark 2010-05-06 20:03:05