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

mec*_*krt 34 tdd unit-testing moq mocking

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

Igo*_*aka 44

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
));
Run Code Online (Sandbox Code Playgroud)

上面的设置将匹配对方法的调用Sum,其值为3 val1,val2值为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);
Run Code Online (Sandbox Code Playgroud)
  • 您希望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();    
Run Code Online (Sandbox Code Playgroud)

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

  • 我没有意识到可以简单地多次调用 Setup() 来设置多个不同的参数,这是我唯一见过它的地方。 (2认同)

P.K*_*P.K 11

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

mock.Setup(foo => foo.DoSomething("ping")).Returns(true);
Run Code Online (Sandbox Code Playgroud)

在这里,您将DoSomething在模拟对象上设置方法.您说,当参数为"ping"时,该方法返回true.

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

进一步参考这些链接:

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

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