2010-05-05 59 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

相关问题