我有一个ASP MVC 3应用程序,在我的模型我已经实现了IValidatableObject。
当我的控制器发布创建或编辑时,我显然只想@R_387_301@,如果它是有效的。
我看到很多博客和帖子和答案,说的话
if(!ModelState.IsValid) { return View(); }
我的问题。为什么ModelState.IsValid在Controller的单元测试中始终为真?
例:
[Test] public void InValidModelsAreNotAdded() { var invalidModel = new MyModel() { SomeField = "some data",SomeOtherField = "" }; var result = _controller.Submit(invalidModel); _repository.AssertWasNotCalled(r => r.Add(Arg.Is.Anything)); }
型号代码:
public class MyModel : IValidatableObject { public string SomeField { get; set; } public string SomeOtherField { get; set; } public IEnumerable Validate(ValidationContext validationContext) { if(string.IsNullOrWhiteSpace(SomeOtherField)) { yield return new ValidationResult("Oops invalid.",new[] {"SomeOtherField"}); } } }
AssertWasNotCalled始终未能通过此测试。
我通过测试,注意到这个测试的ModelState.IsValid是真的。就好像没有调用IValidatableObject.Validate一样。当我运行该项目时,它似乎工作,但这并不是一个方法来测试驱动应用程序。
此外,我意识到我可以使用[必需]属性作为我的例子,但我的真实代码有更复杂的验证。
思考?