asp.net-mvc - MVC 验证的单元测试

标签 asp.net-mvc unit-testing validation asp.net-mvc-2 tdd

当我在 MVC 2 Preview 1 中使用 DataAnnotation 验证时,如何测试我的 Controller 操作在验证实体时是否在 ModelState 中放入了正确的错误?

一些代码来说明。一、 Action :

    [HttpPost]
    public ActionResult Index(BlogPost b)
    {
        if(ModelState.IsValid)
        {
            _blogService.Insert(b);
            return(View("Success", b));
        }
        return View(b);
    }

这是一个失败的单元测试,我认为应该通过但没有通过(使用 MbUnit 和 Moq):

[Test]
public void When_processing_invalid_post_HomeControllerModelState_should_have_at_least_one_error()
{
    // arrange
    var mockRepository = new Mock<IBlogPostSVC>();
    var homeController = new HomeController(mockRepository.Object);

    // act
    var p = new BlogPost { Title = "test" };            // date and content should be required
    homeController.Index(p);

    // assert
    Assert.IsTrue(!homeController.ModelState.IsValid);
}

我想除了这个问题之外,我还应该测试验证吗?我应该以这种方式测试它吗?

最佳答案

讨厌删除旧帖子,但我想我应该添加自己的想法(因为我刚刚遇到这个问题并在寻求答案时遇到了这篇文章)。

  1. 不要在 Controller 测试中测试验证。您要么信任 MVC 的验证,要么编写自己的验证(即不要测试别人的代码,测试您的代码)
  2. 如果您确实想测试验证是否符合您的预期,请在模型测试中对其进行测试(我这样做是为了进行一些更复杂的正则表达式验证)。

这里您真正想要测试的是您的 Controller 在验证失败时是否执行您期望的操作。这就是您的代码和您的期望。一旦您意识到这就是您想要测试的全部内容,测试就很容易了:

[test]
public void TestInvalidPostBehavior()
{
    // arrange
    var mockRepository = new Mock<IBlogPostSVC>();
    var homeController = new HomeController(mockRepository.Object);
    var p = new BlogPost();

    homeController.ViewData.ModelState.AddModelError("Key", "ErrorMessage"); // Values of these two strings don't matter.  
    // What I'm doing is setting up the situation: my controller is receiving an invalid model.

    // act
    var result = (ViewResult) homeController.Index(p);

    // assert
    result.ForView("Index")
    Assert.That(result.ViewData.Model, Is.EqualTo(p));
}

关于asp.net-mvc - MVC 验证的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1269713/

相关文章:

c# - 在 MongoDB 的嵌套文档中插入新文档

c# - MVC Razor 字符问题

asp.net - 为什么 MetadataType 不在数据库优先方法中进行验证?

javascript - 后端驱动网站的 javascript 单元测试

Angular Testing "Office is not defined"

javascript - 结合 JS 客户端验证时,不会触发 JSF ajax 请求

c# - 如何创建复选框列表?

c# - MVC SelectListItem 不实现等于吗?

ruby - Hanami 验证年份小于 X

asp.net-mvc - Timepicker 字段必须是日期 - 验证失败