我们有一个 MVC.NET Core Web API 应用程序,它使用操作过滤器来验证控制器方法的参数。
对于验证,我们使用 FluentValidation 框架。在动作过滤器中,我们找到控制器动作的参数在IValidator<TModel>
哪里,例如:TModel
public async Task<IActionResult> Post([FromBody] TModel model)
{
}
在过滤器中OnActionExecuting(ActionExecutingContext context)
,我们找到正确的验证器 ( IValidator<TModel>
),验证参数 ( context.ActionArguments
),如果验证失败,我们通过将验证结果分配给 - 进行短路,context.Result
这意味着执行永远不会到达控制器。
基本原理类似于将 FluentValidation 连接到 MVC 的 ModelState 验证管道中,但我们需要一些额外的东西,所以我们手动进行。
我们想对控制器和验证器进行单元测试。问题在于对控制器进行单元测试。在测试设置中,我们实例化控制器并调用其方法之一。现在在生产环境中,参数将始终得到验证,并且只有在参数有效时才会真正进入控制器方法。但是当对控制器进行单元测试时,我们很容易传递无效的参数并得到意外的行为。
原则上,有没有办法解决这个问题?或者我是否真的需要确保在测试方法中我将有效参数传递给控制器?
编辑:
我们还计划进行集成测试(很可能使用 .NET Core 的 TestServer)以确保管道正常工作。在这篇文章中,我只想讨论从单元测试方法传递到控制器的无效参数的问题。