【问题标题】:Is this a good way to setup Moq to return a particular value only a certain number of times?这是设置 Moq 以仅返回特定值特定次数的好方法吗?
【发布时间】:2010-05-05 21:56:33
【问题描述】:

使用 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));
}

这个测试很难理解吗?这是一种有效/干净的方法吗?有没有更好的办法?以这种方式编写测试让我感到厌烦。

【问题讨论】:

    标签: c# tdd nunit moq unit-testing


    【解决方案1】:

    我想我会这样做:

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

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

    【讨论】:

    • 我似乎无法在 Moq 3.1.416 中以这种方式进行 AtMost 调用。这是 4.0 测试版吗?但我认为没有回调会更干净,即使我必须在验证中指定时间。谢谢。
    猜你喜欢
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    相关资源
    最近更新 更多