gpt4 book ai didi

unit-testing - 如何在用 [ApiController] 装饰的 Controller 中对模型验证进行单元测试?

转载 作者:行者123 更新时间:2023-12-04 01:24:08 37 4
gpt4 key购买 nike

正如 this anwer 中所指出的至 Asp.Net Core 2.1 ApiController does not automatically validate model under unit test ,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);

关于unit-testing - 如何在用 [ApiController] 装饰的 Controller 中对模型验证进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52842294/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com