我有一个ASP MVC 3应用程序,在我的模型中我实现了IValidatableObject.
当我的控制器发布创建或编辑时,我显然只想保存模型,如果它是有效的.
我看到许多博客,帖子和答案都说得像
if(!ModelState.IsValid)
{
return View();
}Run Code Online (Sandbox Code Playgroud)
我的问题.为什么ModelState.IsValid在Controller的单元测试中始终为true?
例:
[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));
}Run Code Online (Sandbox Code Playgroud)
型号代码:
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"});
}
}
}
Run Code Online (Sandbox Code Playgroud)
AssertWasNotCalled总是无法通过此测试.
我完成了测试并注意到此测试的ModelState.IsValid为true.就好像没有调用IValidatableObject.Validate一样.它似乎在我运行项目时起作用,但这并不是测试驱动应用程序的方法.
此外,我意识到我可以在[Required]我的示例中使用该属性,但我的真实代码对它有更复杂的验证.
思考?
Cra*_*ntz 23
这是真的,因为你没有调用任何设置为假的东西.
这通常发生在绑定期间,但由于您只是在测试中直接传递模型,因此您完全跳过了.
如果您正在尝试测试验证,请直接执行此操作.如果您正在尝试测试控制器中的错误路径,那么您的测试安排可以调用_controller.ModelState.AddModelError( //...