c# - 如何防止因未设置模拟对象的期望而导致吞咽异常?

标签 c# .net unit-testing exception mstest

我正在寻找一种方法来修改 catch block ,具体取决于它是否在单元测试运行期间执行。目的基本上是检测/设置模拟期望,这些期望被吞没,因为 catch 不会重新抛出。

我正在使用 MSTest。

一个明显的事情是使用预处理器,但我认为它不起作用。特别是如果使用 DEBUG 定义。应该有一种简单的方法可以检测到这一点,不是吗?我一定是在寻找错误的地方,因为我找不到太多相关信息。

try {...}
catch(Exception)
{
    Log(...);
#if DEBUG
        throw;
#endif

}

答案:将 try 的主体提取到另一个方法中并对其进行测试。由乔恩和里奇提供。请参阅乔恩的回答下的讨论。不过还是感谢大家的贡献。

最佳答案

如果您想更改异常处理,如何测试异常处理?测试改变的行为并不能测试如果您不改变行为会发生什么。

希望您的模拟有其他方式允许您在测试结束时验证期望,这样您就可以避免异常被这种方式忽略 - 并且您应该测试您的日志和修复是否确实做到了 当你想要的时候就会发生。 (测试日志记录很乏味,而且很少值得,但 Fix 可能做了一些重要的事情。)您还应该测试异常是否不会被重新抛出,如果这是设计的一部分。

(顺便说一句,捕获 ArgumentException 通常是一个不好的信号。但在这种情况下,可能是由于库设计不当造成的,您必须使用。)

编辑:正如一个想法,如果您要能够测试 Log 和 Fix,这意味着您必须能够检查它们是否被调用。如果您不希望抛出异常,您应该能够验证它们没有被调用。如果是,那么您就有效地证明了抛出了异常。

关于c# - 如何防止因未设置模拟对象的期望而导致吞咽异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5190699/

相关文章:

c# - 如何使用C#和Active Reports创建报告?

c# - 如何防止调用结构的默认构造函数?

c# - 如何比较 "look alike"的 Unicode 字符?

django - Django 中的单元测试 - 在哪里划线?

javascript - 主干测试 - 在 "change"元素上触发 'select' 事件

c# - Entity Framework 4.1 : select by multiple conditions?

c# - 为什么隐藏字段值没有发布在 mvc 4 中?

c# - 重新抛出异常

unit-testing - 如何重置 autofac 容器?

c# - 如何在c#中只显示小数点后2个空格