我正在通过Adam Freeman和Stephen Sanderson(Apress)的书,Pro ASP.Net MVC3框架。在第8章末尾,我们创建了一个购物车应用程序和单元测试。到目前为止我没有遇到任何问题,但现在单元测试失败是因为我不明白。本书的勘误没有提到这个问题。
我使用的是Windows 7 64位,。Net 4,VS 2010 Ultimate。
ShippingDetails类的实例(送货地址等)和Cart类的实例(已订购的商品)将传递给CartController" Checkout" action,返回ViewResult。如果ModelState有效,则处理完成,清除购物车并返回View(" Completed")。如果ModelState无效,则返回View(shippingDetails)(shippingDetails是传入的参数)。
我们创建了一个单元测试,以确保无法检出空车。实例化CartController并调用其Checkout操作,传递Cart和ShippingDetails的新实例,以便购物车中的项目数为0。
从控制器的Checkout操作返回时(在单元测试调试模式下)我可以将鼠标悬停在后续代码中的result.ViewData上("结果"作为返回的ViewResult)并查看& #34; result.ViewData引发了类型' System.ArgumentException'"的异常。扩展信息,我看到" base"和"消息","无法在对象实例上找到方法。"失败的单元测试的详细说明:测试方法SportsStore.UnitTests.CartTests.Cannot_Checkout_Empty_Cart引发异常:System.EntryPointNotFoundException:找不到入口点。
这是CartController" Checkout"动作:
[HttpPost]
public ViewResult Checkout(Cart cart, ShippingDetails shippingDetails)
{
if (cart.Lines.Count() == 0) {
ModelState.AddModelError("Cart", "Sorry, your cart is empty!");
}
if (ModelState.IsValid) {
orderProcessor.ProcessOrder(cart, shippingDetails);
cart.Clear();
return View("Completed");
} else {
return View(shippingDetails);
}
}
以下是单元测试:
[TestMethod]
public void Cannot_Checkout_Empty_Cart()
{
// Arrange
Mock<IOrderProcessor> mock = new Mock<IOrderProcessor>();
Cart cart = new Cart();
ShippingDetails shippingDetails = new ShippingDetails();
CartController target = new CartController(null, mock.Object);
// Act
ViewResult result = target.Checkout(cart, shippingDetails);
// Assert - check that the order hasn't been passed on to the processor
mock.Verify(m => m.ProcessOrder(It.IsAny<Cart>(), It.IsAny<ShippingDetails>()),
Times.Never());
// Assert - check that the method is returning the default view
Assert.AreEqual("", result.ViewName);
// Assert - check that we are passing an invalid model to the view
Assert.AreEqual(false, result.ViewData.ModelState.IsValid);
}
感谢您的帮助。请注意,这是之前在ASP.Net MVC论坛上发布的,但没有得到回复。
答案 0 :(得分:1)
我能够解决这个问题,看来我的测试项目引用了MVC 4而web项目引用了MVC 3.我让测试项目引用了MVC 3,现在它工作得很好