【问题标题】:Mock objects - Setup method - Test Driven Development模拟对象 - 设置方法 - 测试驱动开发
【发布时间】:2011-03-11 21:58:55
【问题描述】:

我正在学习测试驱动开发并尝试使用 Moq 库进行模拟。 Mock类的Setup方法的作用是什么?

【问题讨论】:

    标签: unit-testing tdd mocking moq


    【解决方案1】:

    Moq Mock 对象的默认行为是存根所有方法和属性。这意味着使用任何参数对该方法/属性的调用都不会失败,并将返回特定返回类型的默认值。

    您出于以下任何或所有原因调用Setup 方法:

    • 您想限制方法的输入值。
    public interface ICalculator {
      int Sum(int val1, val2);
    }
    
    var mock = new Mock<ICalculator>();
    mock.Setup(m=>m.Sum(
      It.IsAny<int>(), //Any value
      3                //value of 3
    ));
    

    上述设置将匹配对方法 Sum 的调用,val1val2 的任何值都为 3。

    • 您想要返回一个特定的值。继续ICalculator 示例,无论输入参数如何,以下设置都将返回值 10:
    var mock = new Mock<ICalculator>();
    mock.Setup(m=>m.Sum(
      It.IsAny<int>(), //Any value
      It.IsAny<int>()  //Any value
    )).Returns(10);
    
    • 您想在设置后使用Mock&lt;T&gt;.VerifyAll() 来验证所有之前的设置是否已被调用(一次)。
    var mock = new Mock<ICalculator>();
    mock.Setup(m=>m.Sum(
      7, //value of 7
      3                //value of 3
    ));
    
    mock.Setup(m=>m.Sum(
      5, //value of 5
      3                //value of 3
    ));
    
    mock.VerifyAll();    
    

    上面的代码验证Sum被调用了两次。一次是(7,3),一次是(5,3)

    【讨论】:

    • 我没有意识到可以简单地多次调用 Setup() 来设置多个不同的参数,这是我唯一见过的地方。
    • Sum 方法在涉及时如何返回自定义异常消息?是 .Throws(new Exception("Test Message")) 吗?
    【解决方案2】:

    Setup 方法用于设置对 mock 对象的期望 例如:

    mock.Setup(foo => foo.DoSomething("ping")).Returns(true);
    

    在这里,您正在模拟对象上设置DoSomething 方法。你是说,当参数为“ping”时,方法返回true。

    现在,此对象可以进一步充当模拟或存根,具体取决于您的使用情况。如果您想在基于状态的测试中使用它,它可以充当存根。如果您想在基于行为的测试中使用它,它可以充当模拟。在行为测试中,你会调用 mock 对象的 verify 方法来断言该方法是用“ping”参数调用的

    进一步参考这些链接:

    http://martinfowler.com/articles/mocksArentStubs.html

    http://code.google.com/p/moq/wiki/QuickStart

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-24
      • 2014-06-07
      • 2012-07-25
      • 2011-09-09
      • 2012-10-10
      相关资源
      最近更新 更多