【问题标题】:Using Moq setting up all methods of a mock equally使用 Moq 平等地设置模拟的所有方法
【发布时间】:2013-10-15 18:51:42
【问题描述】:

假设我有接口

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);

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

问题: 是否有更聪明的方法来以相同的方式初始化 Mock 的所有(匹配)方法?类似的东西

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

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

(意思是:设置那些返回类型为int的方法)?

【问题讨论】:

  • 我认为这些不受支持。请注意,如果您在模拟上使用 Mock.Strict 即 var mock = new Mock(MockBehavior.Strict);,如果尚未在测试中为这些模拟配置设置,您的测试将失败。
  • 我确信 Moq 没有什么原生的可以做到这一点,但你可以编写一个扩展方法来使用反射来做你想做的事情。

标签: .net unit-testing moq


【解决方案1】:

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

mock.SetReturnsDefault(1);

有关更多信息,请参阅源中的SetReturnsDefaultMoq on github

【讨论】:

  • 如果他想要异常,他可以使用new Mock&lt;A&gt;(MockBehavior.Strict) 并且(再次)不执行任何.Setup(...)。然后每次调用都会抛出异常。不是new Exception(),而是一个特定的异常说成员尚未设置。
  • 感谢您的回答!抱歉耽搁了,在过去的几周里我无法测试这个。但它有效。 @JeppeStigNielsen 也感谢您的建议,在我的场景中它非常有帮助,因为我只想测试如果发生 any 异常会发生什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-12
  • 1970-01-01
  • 2013-07-22
  • 2011-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多