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
希望能帮助到你。
- Swashbuckle 5找不到我的ApiControllers
- 如何模拟UserManager和RoleManager进行unit testing
- WebApi + Simple Injector + OWIN
- 使用newtonsoft或restsharp反序列化json字符串
- OverrideAuthenticationAttribute的用途是什么?
- 自定义MultipartFormDataStreamProvider上传后,通过WebApi从SQL下载大文件
- Web API路由到操作名称
- 无法在ASP.NET WebApi控制器中读取Request.Content
- 如何使ASP.NET Web API与版本控制和帮助页面扩展一起使用?