9

假设我有界面

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 的所有(匹配)方法?就像是

mock.SetupAll().Throws(new Exception());

或者

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

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

4

1 回答 1

9

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

mock.SetReturnsDefault(1);

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

于 2013-11-30T07:46:23.817 回答