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

Unit testing 模拟对象-设置方法-测试驱动开发,unit-testing,tdd,mocking,moq,Unit Testing,Tdd,Mocking,Moq,我正在学习测试驱动开发,并尝试使用Moq库进行模拟。模拟类的设置方法的目的是什么?设置方法用于设置对模拟对象的期望 例如: mock.Setup(foo => foo.DoSomething("ping")).Returns(true); 这里您正在对模拟对象设置DoSomething方法。您的意思是,当参数为“ping”时,该方法返回true 现在,根据您的使用情况,该对象可以进一步充当模拟或存根。如果您想在基于状态的测试中使用它,它可以充当存根。如果您想在基于行为的测试中使用它,它可

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

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

mock.Setup(foo => foo.DoSomething("ping")).Returns(true);
这里您正在对模拟对象设置
DoSomething
方法。您的意思是,当参数为“ping”时,该方法返回true

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

进一步参考以下链接:


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

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

  • 您希望将输入值限制为该方法
  • 您希望在设置后使用
    Mock.VerifyAll()
    来验证是否调用了以前的所有设置(一次)
var mock=new mock();
mock.Setup(m=>m.Sum(
7,//值为7
3//3的值
));
mock.Setup(m=>m.Sum(
5,//值为5
3//3的值
));
mock.VerifyAll();

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

我没有意识到可以多次调用Setup()来设置多个不同的参数,而这是我唯一看到它的地方。我如何做,Sum方法在涉及时将返回自定义异常消息?抛出(新异常(“测试消息”))?
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
));
var mock = new Mock<ICalculator>();
mock.Setup(m=>m.Sum(
  It.IsAny<int>(), //Any value
  It.IsAny<int>()  //Any value
)).Returns(10);
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();