unit testing中的模型状态validation

我正在为这样的控制器编写unit testing:

public HttpResponseMessage PostLogin(LoginModel model) { if (!ModelState.IsValid) return new HttpResponseMessage(HttpStatusCode.BadRequest); } 

该模型看起来像:

 public class LoginModel { [Required] public string Username { set; get; } [Required] public string Password { set; get; } } 

然后我有像这样的unit testing:

 [TestMethod] public void TestLogin_InvalidModel() { AccountController controller = CreateAccountController(); ... var response = controller.PostLogin(new LoginModel() { }); Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode); } 

实际上ModelState已经过validation……这对我来说很奇怪,因为这两个字段都是必需的……有人可以提供建议吗?

模型状态有效的原因是当您新建控制器时会创建新的模型状态。 Web API在这里没有为您执行参数绑定,因此它甚至没有机会添加模型状态错误。

如果您想将其作为unit testing,那么您应该自己添加模型状态错误并测试会发生什么。

如果您想测试模型状态在实际请求中是无效的,我建议您阅读此博客文章:

http://blogs.msdn.com/b/youssefm/archive/2013/01/28/writing-tests-for-an-asp-net-webapi-service.aspx

并尝试针对内存服务器进行测试。 对于您的情况,一个小注意事项是您可能希望在请求上使用StringContent而不是ObjectContent,以确保Web API尝试反序列化并正确绑定正文。

TL; DR如果您不想阅读Youssef提供的整篇文章,并希望快速解决如何使ModelState.IsValid返回false。 做这个。

 [TestMethod] public void TestLogin_InvalidModel() { AccountController controller = CreateAccountController(); // new code added --> controller.ModelState.AddModelError("fakeError", "fakeError"); // end of new code ... var response = controller.PostLogin(new LoginModel() { }); Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode); } 

现在我可以想象CreateAccountController()看起来像这样最小 – >

 return new AccountApiController() { Request = new HttpRequestMessage(), Configuration = new HttpConfiguration() }; 

希望这给那些谷歌搜索的快速答案:)

如前所述,您需要集成测试来validationModelState。 因此,使用Asp.Net Core,我正在挖掘这个问题,以添加一个简单的解决方案,用于将测试与Asp.Net Core集成并validationModelState

添加Microsoft.AspNetCore.TestHost包,您可以这么简单地提交请求:

 var server = new TestServer(new WebHostBuilder().UseStartup()); var client = server.CreateClient(); var model = new { Name = String.Empty }; var content = new StringContent(JsonConvert.SerializeObject(model), Encoding.UTF8, "application/json"); var result = await client.PostAsync("/api/yourApiEndpoint", content); result.StatusCode.Should().Be(HttpStatusCode.BadRequest); 

你可以在这里找到更多相关信息: http : //asp.net-hacker.rocks/2017/09/27/testing-aspnetcore.html

希望能帮助到你。