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

时间:2018-10-16 18:59:31

标签: unit-testing asp.net-core asp.net-core-webapi asp.net-core-2.1

正如this anwerAsp.Net Core 2.1 ApiController does not automatically validate model under unit test中指出的那样,ASP.NET Core 2.1的ApiControllerAttribute为我们提供的自动ModelState验证仅在实际在运行时请求动作时起作用,而不是通过使用单元测试中的参数无效。

但是,我仍然想测试在提供不正确的模型时我的动作是否实际上返回BadRequestResult。有什么办法吗?我知道我仍然可以手动检查ModelState.IsValid是否为false,然后自己返回BadRequest(),但是这种方法无法实现自动验证的目的。

我还是坚持手动检查ModelState.IsValid,还是在单元测试中有办法利用新的ApiControllerAttribute模型验证?

1 个答案:

答案 0 :(得分:2)

如果要验证在数据注释损坏时api是否正在返回badrequest,则需要进行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);