gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:07:24 24 4
gpt4 key购买 nike

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

文章通过向 Application_Start 添加一行解释了如何让这个过滤器在全局范围内工作:

GlobalConfiguration.Configuration.Filters.Add(new MyExceptionFilter());

不幸的是,当我运行我的单元测试时,这一行永远不会被执行。

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

有什么方法可以让 NUnit 项目全局应用这个自定义异常过滤器吗?

最佳答案

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

在您的单元测试中,您永远不会拥有 Web 应用程序的上下文,因为您正在测试类和方法。当您只需要测试代码的原子性时,期待这种行为是个坏主意。

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

  • 如果发生某些事情,预计会出现业务异常,例如 CustomerNotFoundException

如果测试触发了预期的异常,那么测试就OK了。然后您可以对未处理的异常执行过滤器,但它完全超出了测试边界。

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

考虑业务异常:根据您的逻辑抛出您期望抛出的异常。如果无法处理所有条件,请在 Application_Start 中附加一个过滤器,但它完全在 Controller 中的方法之外。

关于c# - 如何让 NUnit 测试项目使用自定义异常过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30301305/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com