C# DotNet Core,如何使用自定义模型绑定对控制器操作方法进行单元测试

C# DotNet Core,如何使用自定义模型绑定对控制器操作方法进行单元测试,c#,unit-testing,asp.net-core,xunit,xunit.net,C#,Unit Testing,Asp.net Core,Xunit,Xunit.net,使用ASP.Net Core 2.2,我的PUT中使用了ModelBinder,如下所示: [HttpPut("{taskIdentifier}/{number}")] public async Task<IActionResult> Put(string taskIdentifier, string number, [ModelBinder(typeof(TaskUpdateV1Binder<TaskUpdate>))]TaskUpdate v

使用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)
[HttpPut(“{taskIdentifier}/{number}”)]
公共异步任务Put(字符串任务标识符、字符串编号、,
[ModelBinder(typeof(TaskUpdateV1Binder))]TaskUpdate值)
在运行时,调用TaskUpdateV1Binder,它读取请求正文并创建TaskUpdate对象

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

我已经对活页夹本身进行了测试,但我需要测试控制器正在使用的活页夹。
我不是在测试MVC路由

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

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

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

这可以通过集成测试实现,集成测试可以在部署之前运行。有人问了一个类似的问题,回答得很好(IMHO)。如果你想看到一个简单的解释和例子,请查看它


正如回答中所建议的,我还建议您阅读以下文档:

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