【发布时间】:2019-11-21 08:20:29
【问题描述】:
我有一个方法,它接受一个 JSON 对象并对其进行多个处理阶段,在每个阶段更新数据库中的值。我们希望此方法具有容错性,并决定所需的行为是,如果任何处理阶段失败,则将错误记录到数据库并继续下一个处理阶段,而不是中止。
我刚刚对其中一个处理步骤的行为进行了几处更改。然后我运行了我们的单元测试套件,预计有几个测试会由于新行为而失败,并指出潜在的问题区域。相反,测试都通过了。
经过调查,我意识到运行测试的模拟数据不包含对新行为很重要的某些关键值。测试实际上在运行时抛出异常,但异常被捕获和处理 - 而且,因为测试没有在启用记录器的情况下运行,所以它们被完全抑制。因此,新代码不会以会导致测试失败的方式更改数据,因为它会默默地出错。
这似乎是单元测试要解决的问题,而它们没有显示任何痕迹的事实意味着它们没有达到目的。有什么方法可以使用 NUnit 断言没有抛出异常,即使它已被处理?或者,是否有一种明智的重构方法可以更好地暴露这个问题?
(在 C# 中工作,但问题似乎与语言无关)
【问题讨论】:
-
并非如此,测试函数的行为在更改前后(就调用者而言)保持不变,因此所有测试都通过了。如果你引入了新的副作用,你也应该编写单元测试。在您的情况下,我想测试错误日志记录很困难,但我想既然您可以预测执行路径,您就知道 logger 将被调用多少次,因此您可以使用一些模拟记录器并断言模拟记录器被称为预期数量次。
-
你的类的预期行为是它应该捕获某些异常并记录它们。您无法测试捕获异常。您只能测试一个类的作用——它返回的结果、状态的变化以及它引起的影响。在这种情况下,您要测试代码产生的效果,并将其输出到日志中。这意味着您必须模拟日志。它可以像创建将消息添加到列表的日志实现一样简单。如果您包含一些代码来显示您如何调用记录器(是否已注入),那么我们可以提供更多详细信息。
-
它被注入了,我刚刚使用 NSubstitute 创建了一个 subbed 记录器,每当调用它的
LogError函数时都会引发异常,现在我的大部分测试都失败了!感谢您的建议!
标签: c# unit-testing exception nunit