使用Moq同样设置模拟的所有方法

Des*_*sty 8 .net unit-testing moq

我们假设我有接口

public interface A {
  int Foo1();

  int Foo2();

  int Foo3();
}
Run Code Online (Sandbox Code Playgroud)

和一个模拟(使用Moq)的测试方法

Mock<A> mock = new Mock<A>();
Run Code Online (Sandbox Code Playgroud)

现在基本上有两种测试方案:

场景1

如果接口实现在任何方法上抛出特定异常,我想测试我的测试系统会做什么.所以我想设置所有方法来抛出相同的异常,如

mock.Setup(x => x.Foo1()).Throws(new Exception());
mock.Setup(x => x.Foo2()).Throws(new Exception());
mock.Setup(x => x.Foo3()).Throws(new Exception());
Run Code Online (Sandbox Code Playgroud)

情景2

如果方法返回任何数字,我想测试我的测试系统会做什么.所以我可以想到设置模拟就好

mock.Setup(x => x.Foo1()).Returns(1);
mock.Setup(x => x.Foo2()).Returns(1);
mock.Setup(x => x.Foo3()).Returns(1);
Run Code Online (Sandbox Code Playgroud)

原因: 我对被测系统进行了许多不同的单元测试.其中一些是对业务逻辑的测试,它会产生差异,例如返回什么值.但有些只是对一般行为的小测试,例如,如果被测系统抛出一个异常,如果其中一个使用的组件抛出一个异常.或者相反,如果所有组件都按预期运行,则被测系统不会抛出异常.对于这些小测试,我现在正在使用上面的代码.

问题: 是否有更聪明的方法以相同的方式初始化模拟的所有(匹配)方法?就像是

mock.SetupAll().Throws(new Exception());
Run Code Online (Sandbox Code Playgroud)

要么

mock.SetupAll<int>().Returns(1);
Run Code Online (Sandbox Code Playgroud)

(这意味着:设置那些返回类型为的方法int)?

Ole*_*nge 7

这可以通过以下方式实现SetReturnsDefault:

mock.SetReturnsDefault(1);
Run Code Online (Sandbox Code Playgroud)

有关SetReturnsDefault更多信息,请参阅源代码:github上的Moq

  • 在他需要异常的情况下,他可以使用`new Mock <A>(MockBehavior.Strict)`和(再次)不执行任何`.Setup(...)`.然后每次调用都会抛出异常.虽然不是`new Exception()`,但是还没有设置成员的特定异常. (5认同)