gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 05:18:42 25 4
gpt4 key购买 nike

当我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com