Csharp/C#教程:在Asp.Net MVC Web Api中测试Controller时,ModelState.IsValid始终为true分享


在Asp.Net MVC Web Api中测试Controller时,ModelState.IsValid始终为true

我试图使这个工作,并进行了许多google / stackoverflow搜索,没有运气。

我有一个简单的模型:

public class MovieModel { public string Id { get; set; } [Required] [StringLength(100)] public string Name { get; set; } } 

控制器中的方法:

 // POST: api/Movies public IHttpActionResult Post([FromBody]MovieModel movieModel) { if (ModelState.IsValid) { //Code } } 

一个测试方法(是一个集成测试,但在unit testing中会发生同样的情况):

 [TestMethod] public void MoviesController_Post_Without_Name() { // Arrange var model = new MovieModel(); model.Name = ""; // Act var result = controller.Post(model); // Assert Assert.IsInstanceOfType(result, typeof(InvalidModelStateResult)); Assert.AreEqual(6, controller.Get().Count()); } 

尽管模型显然无效,但它总是将IsValid属性评估为true。

到目前为止,我尝试了许多方法但没有成

您的解决方案可能有效,但更好的方法是使用ApiController.Validate方法。

 public void MoviesController_Post_Without_Name() { // Arrange var model = new MovieModel(); model.Name = ""; // Act controller.Validate(model); //<---- use the built-in method var result = controller.Post(model); // Assert Assert.IsInstanceOfType(result, typeof(InvalidModelStateResult)); Assert.AreEqual(6, controller.Get().Count()); } 

感谢这个网站,我找到了解决方案:

 private void SimulateValidation(object model) { // mimic the behaviour of the model binder which is responsible for Validating the Model var validationContext = new ValidationContext(model, null, null); var validationResults = new List(); Validator.TryValidateObject(model, validationContext, validationResults, true); foreach (var validationResult in validationResults) { this.controller.ModelState.AddModelError(validationResult.MemberNames.First(), validationResult.ErrorMessage); } } 

并在测试方法中包含一行,如下所示:

 public void MoviesController_Post_Without_Name() { // Arrange var model = new MovieModel(); model.Name = ""; // Act SimulateValidation(model); var result = controller.Post(model); // Assert Assert.IsInstanceOfType(result, typeof(InvalidModelStateResult)); Assert.AreEqual(6, controller.Get().Count()); } 

希望能帮到某人,这样可以节省我一些时间在网上搜索。

这对我有用:

 public MyResultData Post([FromBody] MyQueryData queryData) { if (!this.Request.Properties.ContainsKey("MS_HttpConfiguration")) { this.Request.Properties["MS_HttpConfiguration"] = new HttpConfiguration(); } this.Validate(queryData); if (ModelState.IsValid) { DoSomething(); } } 

另请查看此问题: unit testing中的validation失败

上述就是C#学习教程:在Asp.Net MVC Web Api中测试Controller时,ModelState.IsValid始终为true分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/951578.html

(0)
上一篇 2021年11月18日
下一篇 2021年11月18日

精彩推荐