单元测试控制器

时间:2011-06-22 10:42:06

标签: asp.net-mvc asp.net-mvc-3

我有一个非常简单的场景:

[HttpGet]
public ActionResult CreateUser()
{
    return View();
}

[HttpGet]
public ActionResult Thanks()
{
    return View();
}

[HttpPost]
public ActionResult CreateUser(CreateUserViewModel CreateUserViewModel)
{
    if (ModelState.IsValid)
    {
    return View("Thanks");
    }

    return View(CreateUserViewModel);
}

我的单元测试使用来自mvc contrib的testhelper:

[Test]
public void UserController_CannotCreateUserWithNoLastName()
{
    // arrange
    UsersController UsersController = new UsersController();
    CreateUserViewModel CreateUserViewModel = new CreateUserViewModel();
    CreateUserViewModel.LastName = "";

    // act
    ActionResult result = UsersController.CreateUser(CreateUserViewModel);

    // assert
    result.AssertViewRendered().ForView("CreateUser");
}

当我打开浏览器并尝试提交无效用户(无姓氏)时,它会重定向到createuser表单,但单元测试失败(表示它重定向到感谢)。为什么是这样?谁能看到有什么不对劲?谢谢!

2 个答案:

答案 0 :(得分:7)

在您的单元测试中,您应该模拟您的模型有错误,因为它是您要测试的(错误路径)。在您的测试中,模型是有效的,这就是为什么它将您重定向到“Thanks”视图。要模拟错误,您可以在“行为”部分之前在单元测试中执行此操作:

UsersController.ModelState.AddModelError("username", "Bad username"); 

看一下这个例子:http://www.thepursuitofquality.com/post/53/how-to-test-modelstateisvalid-in-aspnet-mvc.html

有关AddModelError方法的更多信息,请访问:http://msdn.microsoft.com/en-us/library/system.web.mvc.modelstatedictionary.addmodelerror.aspx

答案 1 :(得分:3)

我相信您使用LastName的DataAnnotations为空,因此ModelBinder将执行验证。 单元测试将跳过ModelBinder和验证。

有关详细信息,请参阅此SO question - 手动调用Controller上的UpdateModel