【问题标题】:Why does a mocked method swallow exceptions?为什么模拟方法会吞下异常?
【发布时间】:2012-07-16 17:06:37
【问题描述】:

当前实施:

void IFileManager.DeleteFile(
  string argFilename )
{
    throw new ArgumentException( "Specified filename was not found" );
}

单元测试

Expect.Once.On( m_MockFileManager ).Method( "DeleteFile" );
....
....

单元测试通过,全部为绿色。我预计测试会失败,因为应该抛出异常。当我在不使用模拟框架的情况下运行此测试时,会引发异常并且测试失败。

为什么 mocking 框架会吞下异常?

【问题讨论】:

  • 什么模拟/单元测试框架?测试方法上有某种[ExpectedException] 属性吗?
  • 当您说“当前实施”时,您的实际意思是什么?这是您放入 Fake 对象的内容,还是真正的实现?对于大多数模拟框架,您的模拟方法在您告诉它要做什么之前不会做任何事情,它只是一个空方法。

标签: c# unit-testing mocking nmock2


【解决方案1】:

您可能需要提供比这一行更多的代码,但我猜您正在模拟调用DeleteFile 的对象,它实际上并没有调用DeleteFile 方法。只要代码调用该方法,那么您的代码就会通过。同样,更全面地了解您的代码将提供更好的答案。

【讨论】:

  • 因此,如果我的测试方法中的任何方法调用出现问题(异常)(不是您指出的 DeleteFile),那么我基本上是 SOL?例如,如果我在被测方法中调用了 10 个不同的方法,而这 10 个方法中只有一个发生故障,我不会知道吗?
  • 好吧,如果您期望 DeleteFile 后跟另一个调用,则不应调用该其他方法,因为异常会使该方法短路。我不知道 nmock2 的实现,所以这可能会有所不同
  • 就是这样,所有 10 个方法都被调用,即使中间的一个方法应该抛出异常。我只能猜测模拟框架基于具有空主体的接口创建了一个新的 DeleteFile 实例,因此它甚至没有使用与实际代码相同的实现。
  • 那是我的猜测,你没有明确地创建一个 DeleteFile 的假冒?
猜你喜欢
  • 1970-01-01
  • 2016-06-08
  • 2010-11-02
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 2018-11-15
  • 1970-01-01
  • 2015-11-28
相关资源
最近更新 更多