Asp.net mvc 单元测试MVC控制器
我的ASP.NET MVC应用程序中的控制器根据两条相当直接的规则预先填充视图显示的表单数据 在我的单元测试中,这似乎是一件好事。但是我所能看到的验证表单中是否放置了正确数据的唯一方法是以一种感觉不自然的方式从控制器中提取逻辑 有人能提出解决这个问题的方法吗Asp.net mvc 单元测试MVC控制器,asp.net-mvc,asp.net-mvc-3,unit-testing,Asp.net Mvc,Asp.net Mvc 3,Unit Testing,我的ASP.NET MVC应用程序中的控制器根据两条相当直接的规则预先填充视图显示的表单数据 在我的单元测试中,这似乎是一件好事。但是我所能看到的验证表单中是否放置了正确数据的唯一方法是以一种感觉不自然的方式从控制器中提取逻辑 有人能提出解决这个问题的方法吗 我发现的所有单元测试控制器的示例似乎都很琐碎,比如验证它是否返回了预期的视图类型。我甚至不确定我是否看到了其中的值。您可以通过将返回的对象强制转换到适当的类来进行测试,而不是使用它们的基类(默认情况下返回) 例如,要测试默认的Account
我发现的所有单元测试控制器的示例似乎都很琐碎,比如验证它是否返回了预期的视图类型。我甚至不确定我是否看到了其中的值。您可以通过将返回的对象强制转换到适当的类来进行测试,而不是使用它们的基类(默认情况下返回) 例如,要测试默认的
AccountController
,您需要这样做:
var controller = new AccountController();
var result = controller.LogOn() as ViewResult;
var model = result.Model as LogOnModel;
Assert.IsTrue(model.RememberMe); // assuming you "pre-populated" enabled the checkbox
检查返回的对象是否填充了正确的数据在我看来并不是“不自然的”,或者您的意思有所不同?我同意测试返回的视图类型有些毫无意义。然而,测试预期的“视图”是否与其正确的数据一起返回将是一个有效的测试用例 例如,这里有一个编辑控制器的单一编辑测试用例。请注意,这个示例使用了Moq和Nunit,但除此之外,它是相当直接的 请注意,ViewResult被强制转换为预期的视图模型,然后针对预期的联系人进行断言 测试:
啊<代码>结果。模型看起来很有用。
[Test]
public void Edit_Get_Should_Lookup_Contact_From_Repository_And_Return_Edit_View()
{
// arrange
var _repository = new Mock<IContactRepository>();
var expectedContact = new Contact
{
First = "first",
Last = "last",
Email = "mail@test.com"
};
var mockContext = new Mock<ControllerContext>();
_repository.Setup(x => x.GetById(It.IsAny<int>())).Returns(expectedContact);
var controller = new ContactController(_repository.Object)
{
ControllerContext = mockContext.Object
};
// act
var result = controller.Edit(1) as ViewResult;
var resultData = (Contact)result.ViewData.Model;
// assert
Assert.AreEqual("Edit", result.ViewName);
Assert.AreEqual(expectedContact.First, resultData.First);
Assert.AreEqual(expectedContact.Last, resultData.Last);
Assert.AreEqual(expectedContact.Email, resultData.Email);
}
[HttpGet]
public ActionResult Edit(int id)
{
var contact = _repository.GetById(id);
return View("Edit", contact);
}