控制器单元测试与模型验证

时间:2013-08-09 18:26:25

标签: asp.net-mvc unit-testing

我开始学习MVC4中的单元测试。

这是我的控制器。

public class AccountController : Controller
{
    public ActionResult Register(User user)
    {
        if (ModelState.IsValid)
        {
            return View("RegistrationSuccessful");                
        }
        return View("Register");
    }
}

这是考验。

public class AccountControllerTests
{
    [TestMethod]
    public void invalid_registration_details_should_show_registration_form_again()
    {
        var controller = new AccountController();
        var user = new User();
        user.Name = null;
        var result = controller.Register(user) as ViewResult;
        Assert.AreEqual("Register", result.ViewName);
    }
}

这就是模特。

public class User
{
    [Required]
    public string Name { get; set; }
}

当我调用controller.Register(用户)时,我认为模型绑定器没有进入画面,因为我自己实例化控制器而不是通过框架。所以我认为ModelState.IsValid默认是真的。

我该如何测试?如何在单元测试中触发模型验证?

3 个答案:

答案 0 :(得分:2)

您还可以通过以下方法来验证模型。在我的情况下,ProjectViewModel是我的模型。在下面的场景中,我没有设置Description属性来验证验证是否有效。

[TestMethod]
[ExpectedException(typeof(ValidationException), "Please enter description.")]
public void Create_Project_Empty_Description()
{
    ProjectViewModel model = new ProjectViewModel
    {
        ProjectID = 3,
        Name = "Test Project",
        StartDate = DateTime.Now.Date,
        EndDate = DateTime.Now.AddMonths(-1),
        States = new List<ProjectStateViewModel> { new ProjectStateViewModel { StateName = "Pending" } }
    };

    ValidationContext contex = new ValidationContext(model);
    Validator.ValidateObject(model, contex);
}

答案 1 :(得分:0)

我不确定是否可以触发模型验证,但我知道如何测试它。

试试这段代码:

    [TestClass]
    public class AccountControllerTests
    {
        [TestMethod]
        public void invalid_registration_details_should_show_registration_form_again()
        {
            // arrange
            var controller = new AccountController();
            controller.ViewData.ModelState.AddModelError("Key", "ErrorMessage");

            // act
            var result = controller.Register(new User()) as ViewResult;

            // assert
            Assert.AreEqual("Register", result.ViewName);
        }

        [TestMethod]
        public void valid_registration_details_should_show_registration_successful_page()
        {
            // arrange
            var controller = new AccountController();

            // act
            var result = controller.Register(new User()) as ViewResult;

            // assert
            Assert.AreEqual("RegistrationSuccessful", result.ViewName);
        }
    }

答案 2 :(得分:0)

您可以通过从测试中调用以下方法强制它验证您的模型。对于我的测试,我创建了一个TestHelper类,其中模拟了此方法并为特定条件添加了ModelState.AddModelError()

TryValidateModel(model);// will do the task

也许你需要嘲笑ControllerContext