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

时间:2013-10-08 17:43:52

标签: .net unit-testing moq

我们假设我有接口

public interface A {
  int Foo1();

  int Foo2();

  int Foo3();
}

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

Mock<A> mock = new Mock<A>();

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

情景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());

场景2

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

这样的模拟
mock.Setup(x => x.Foo1()).Returns(1);
mock.Setup(x => x.Foo2()).Returns(1);
mock.Setup(x => x.Foo3()).Returns(1);

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

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

这样的东西
mock.SetupAll().Throws(new Exception());

mock.SetupAll<int>().Returns(1);

(表示:设置返回类型为int的那些方法)?

1 个答案:

答案 0 :(得分:7)

这可以通过SetReturnsDefault来实现,例如:

mock.SetReturnsDefault(1);

有关详细信息,请参阅来源中的SetReturnsDefaultMoq on github