【问题标题】:DotNet Core, How do I unit test a Controller Action method with a custom model bindingDotNet Core,如何使用自定义模型绑定对控制器操作方法进行单元测试
【发布时间】:2019-09-20 17:38:07
【问题描述】:

使用 ASP.Net Core 2.2,我的 PUT 中使用了一个 ModelBinder,如下所示:

[HttpPut("{taskIdentifier}/{number}")]
public async Task<IActionResult> Put(string taskIdentifier, string number, 
            [ModelBinder(typeof(TaskUpdateV1Binder<TaskUpdate>))]TaskUpdate value)

在运行时,TaskUpdateV1Binder 被调用,它读取请求体并创建一个TaskUpdate 对象。

我想对此进行单元测试。我不能直接从单元测试中调用 Put,因为这会绕过模型绑定。

我已经对绑定器本身进行了测试,但我需要测试控制器正在使用它。
我没有测试 MVC 路由。

  • 我想要一个单元测试,如果有人删除 ModelBinder,它将失败 注解。

  • 某些属性由绑定器设置(如 ModelState.IsValid) 我想确保错误的输入产生正确的输出。

  • 这不必使用实际的模型绑定器。我可以模拟一个 这就是我需要的。如果我这样做,我仍然需要至少一个测试来确保注释在代码中正确应用。

【问题讨论】:

  • 您不能对其进行单元测试,因为控制器操作属性是框架在运行时使用的元数据。您需要进行集成测试以测试所需的行为。
  • 如果你已经对 ModelBinder 进行了单元测试,那么在控制器中再次对其进行单元测试的目的是什么。由于模型绑定发生在模型验证之前,并且其结果被传递给控制器​​操作,因此我看不到您可以对此进行单元测试的方式,因为您直接调用控制器操作而不是通过将使用的路由模块模型绑定属性。
  • 有人拆了绑定忘记放回去了。然后他们检查了它,所有的单元测试都通过了。它被部署了。我已经修复了它,但我想要进行测试以确保不会再次发生这种情况。此外,我的代码中有一段检查 ModelState.IsValid 并且测试从未命中它。
  • 如果他们能够删除模型绑定并且它没有通过旨在测试模型绑定的单元测试,那么您实际上有零测试来测试模型绑定。
  • 我的意思是我已经测试了 modelBinder 类。给定正确的输入,它会做它应该做的事情。但是,我没有办法测试控制器是否使用它。这是我的问题。

标签: c# unit-testing asp.net-core xunit xunit.net


【解决方案1】:

这可以通过集成测试来实现,该测试可以在部署之前运行。在 SO 上提出了类似的问题,并很好地回答了(恕我直言)here。如果您想查看简要说明和示例,请查看它。

正如该答案中所建议的,我还建议您仔细阅读以下文档:https://docs.microsoft.com/en-us/aspnet/core/testing/integration-testing

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多