我开始学习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默认是真的。
我该如何测试?如何在单元测试中触发模型验证?
答案 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
。