如何在使用 [ApiController] 修饰的控制器中进行单元测试模型验证?



正如本文所指出的,Asp.Net Core 2.1 ApiController 不会在单元测试下自动验证模型,ASP.NET Core 2.1 的 ApiControllerAttribute 给我们的自动 ModelState 验证仅在运行时实际重新质疑操作时才有效,而不是通过在单元测试中使用无效参数调用它。

但是,我仍然想测试在提供不正确的模型时我的操作是否真的返回了 BadRequestResult。有什么办法可以做到这一点吗?我知道我仍然可以手动检查ModelState.IsValid是否为假,并自己返回BadRequest((,但这违背了自动验证的重点。

我是否被困在手动检查ModelState.IsValid,或者有没有办法在单元测试中使用新的ApiControllerAttribute模型验证?

如果要验证 API 在数据注释损坏时是否返回错误请求,则需要执行 API 集成测试。 一个不错的选择是使用 TestServer 通过内存客户端运行集成测试

下面是一个示例:

//arrange
var b = new WebHostBuilder()
.UseStartup<YourMainApplication.Startup>()
.UseEnvironment("development");
var server = new TestServer(b) { BaseAddress = new Uri(url) };
var client = server.CreateClient();
var json = JsonConvert.SerializeObject(yourInvalidModel);
var content = new StringContent(json, Encoding.UTF8, "application/json");
//act
var result = await client.PostAsync("api/yourController", content);
//assert
Assert.AreEqual(400, (int)result.StatusCode);

如果您只需要确保注释设置正确,则可以通过 TryValidateObject 方法手动触发验证

var obj = new YourClass();
var context = new ValidationContext(obj);
var results = new List<ValidationResult>();
var valid = Validator.TryValidateObject(obj, context, results, true);

最新更新