Bas*_*Bas 3 unit-testing asp.net-core asp.net-core-webapi asp.net-core-2.1
正如在这个对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);
Run Code Online (Sandbox Code Playgroud)
如果您只需要确保注释设置正确,您可以通过TryValidateObject方法手动触发验证
var obj = new YourClass();
var context = new ValidationContext(obj);
var results = new List<ValidationResult>();
var valid = Validator.TryValidateObject(obj, context, results, true);
Run Code Online (Sandbox Code Playgroud)