C# 如何让NUnit测试项目使用自定义异常过滤器?

C# 如何让NUnit测试项目使用自定义异常过滤器?,c#,nunit,asp.net-web-api,C#,Nunit,Asp.net Web Api,我有一个NUnit测试项目,它对Web API项目运行测试。当服务器端出现未处理的异常时,我只会得到一个不透明的HTTP500错误,这对于调试几乎没有什么用处。所以我在谷歌上搜索了这个问题,并找到了它,它帮助我创建了一个很好的自定义异常过滤器,现在我可以在响应中将服务器端异常详细信息传递给UI 本文介绍了如何通过在应用程序\u Start中添加一行代码,使此筛选器全局工作: GlobalConfiguration.Configuration.Filters.Add(new MyException

我有一个NUnit测试项目,它对Web API项目运行测试。当服务器端出现未处理的异常时,我只会得到一个不透明的HTTP500错误,这对于调试几乎没有什么用处。所以我在谷歌上搜索了这个问题,并找到了它,它帮助我创建了一个很好的自定义异常过滤器,现在我可以在响应中将服务器端异常详细信息传递给UI

本文介绍了如何通过在
应用程序\u Start
中添加一行代码,使此筛选器全局工作:

GlobalConfiguration.Configuration.Filters.Add(new MyExceptionFilter());
不幸的是,当我运行单元测试时,这一行永远不会执行

当我用
[MyExceptionFilter]
装饰我的控制器方法时,过滤器工作得很好,但我真的不想在API中的每个控制器上都粘贴这个装饰器


有没有办法让NUnit项目全局应用此自定义异常过滤器?

当您执行单元测试时,您执行的是类而不是其他。对于在Web服务器上运行的Web应用程序,除了类之外,还有许多其他元素(cookie、请求、响应、会话等)。在应用程序启动中,当您注册筛选器时,您告诉Web服务器处理未处理的异常。这意味着服务器本身负责此处理

在单元测试中,您从来没有Web应用程序的上下文,因为您正在测试类和方法。当您只需要测试代码的原子性时,期望出现这种行为是个坏主意

例如,一个好的单元测试可能是(基于本文):

  • 如果发生了某些情况,则需要一个业务异常,如CustomerNotFoundException
如果测试触发了预期的异常,则测试正常。然后,您可以对未处理的异常执行筛选器,但它完全超出了测试边界

据我所知,可以模拟Web应用程序的某些部分(例如,在假的HttpContext中模拟Cookie,StackOverflow中有很多响应)。人们总是希望避免这种情况,因为您需要将测试与外部行为分离,当然,模拟整个Web过程要复杂得多,也不太有利


考虑业务异常:根据您的逻辑抛出您期望抛出的内容。如果无法处理所有条件,请在应用程序_Start中附加一个过滤器,但这完全超出了控制器中的方法。

您好,谢谢您的解释。我不想处理特定的异常;我正在寻找一个一般的捕获案例,当单元测试中断时,我不知道为什么,例如,有人签入的代码在服务器端搞乱了一些东西,现在我只知道我的单元测试抛出HTTP 500错误。我需要能够调试那些单元测试,看看哪里出了问题。