调用ModelState.IsValid的ASP MVC 3测试控制器始终返回true

Ada*_*dam 19 asp.net-mvc-3

我有一个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( //...

  • 控制器不验证模型.他们也没有调用验证器.`ControllerActionInvoker`做到了.所有控制器都可以测试状态. (5认同)