asp.net-mvc-3 – ASP MVC 3测试控制器调用ModelState.IsValid总是返回true

前端之家收集整理的这篇文章主要介绍了asp.net-mvc-3 – ASP MVC 3测试控制器调用ModelState.IsValid总是返回true前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个ASP MVC 3应用程序,在我的模型我已经实现了IValidatableObject。

当我的控制器发布创建或编辑时,我显然只想@R_60_301@,如果它是有效的。

我看到很多博客和帖子和答案,说的话

  1. if(!ModelState.IsValid)
  2. {
  3. return View();
  4. }

我的问题。为什么ModelState.IsValid在Controller的单元测试中始终为真?

例:

  1. [Test]
  2. public void InValidModelsAreNotAdded()
  3. {
  4. var invalidModel = new MyModel() { SomeField = "some data",SomeOtherField = "" };
  5.  
  6. var result = _controller.Submit(invalidModel);
  7.  
  8. _repository.AssertWasNotCalled(r => r.Add(Arg.Is.Anything));
  9.  
  10. }

型号代码

  1. public class MyModel : IValidatableObject
  2. {
  3. public string SomeField { get; set; }
  4. public string SomeOtherField { get; set; }
  5.  
  6. public IEnumerable Validate(ValidationContext validationContext)
  7. {
  8. if(string.IsNullOrWhiteSpace(SomeOtherField))
  9. {
  10. yield return
  11. new ValidationResult("Oops invalid.",new[] {"SomeOtherField"});
  12. }
  13. }
  14. }

AssertWasNotCalled始终未能通过此测试。

我通过测试,注意到这个测试的ModelState.IsValid是真的。就好像没有调用IValidatableObject.Validate一样。当我运行该项目时,它似乎工作,但这并不是一个方法来测试驱动应用程序。

此外,我意识到我可以使用[必需]属性作为我的例子,但我的真实代码有更复杂的验证。

思考?

解决方法

这是真的,因为你没有调用任何设置它的错误

这通常发生在绑定期间,但是由于您只是直接在测试中传递模型,所以您完全跳过。

如果您正在尝试验证验证,请直接进行验证。如果您尝试测试控制器中的错误路径,则测试的安排可以调用_controller.ModelState.AddModelError(// …

猜你在找的asp.Net相关文章