模拟对象 - 设置方法 - 测试驱动开发

时间:2010-07-05 13:05:55

标签: unit-testing tdd mocking moq

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

2 个答案:

答案 0 :(得分:42)

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<T>.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)

答案 1 :(得分:9)

Setup方法用于设置模拟对象的期望值 例如:

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

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

现在,根据您的使用情况,此对象可以进一步充当模拟或存根。如果要在基于状态的测试中使用它,它可以充当存根。如果要在基于行为的测试中使用它,它可以充当模拟。在行为测试中,您将在模拟对象上调用verify方法以声明该方法是使用“ping”参数调用的

进一步参考这些链接:

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

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