【发布时间】:2011-12-27 22:52:13
【问题描述】:
我正在阅读 Adam Freeman 和 Stephen Sanderson (Apress) 所著的 Pro ASP.Net MVC3 Framework 一书。在第 8 章快结束时,我们创建了一个购物车应用程序和单元测试。到目前为止,我没有遇到任何问题,但是现在单元测试由于我不明白的原因而失败了。本书的勘误没有提到这个问题。
我使用的是 Windows 7 64 位、.Net 4、VS 2010 Ultimate。
一个 ShippingDetails 类的实例(送货地址等)和一个 Cart 类的实例(订购的商品)被传递给 CartController 的“Checkout”操作,该操作返回一个 ViewResult。如果 ModelState 有效,则处理完成,清除购物车并返回 View("Completed")。如果 ModelState 无效,则返回 View(shippingDetails)(shippingDetails 为传入参数)。
我们创建了一个单元测试,以确保无法签出空购物车。实例化 CartController 并调用其 Checkout 操作,传递 Cart 和 ShippingDetails 的新实例,因此购物车中的商品计数为 0。
从控制器的 Checkout 操作返回时(在单元测试调试模式下),我可以将鼠标悬停在后续代码中的 result.ViewData 上(“result”是返回的 ViewResult)并看到“result.ViewData 抛出了类型为 ' 的异常System.ArgumentException'”。展开信息,我看到“基础”和“消息”,“找不到对象实例上的方法”。失败的单元测试的详细信息说:测试方法 SportsStore.UnitTests.CartTests.Cannot_Checkout_Empty_Cart throw exception: System.EntryPointNotFoundException: Entry point was not found.
这是 CartController“结帐”操作:
[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 论坛上发布的,但没有得到回应。
【问题讨论】:
-
你有没有解决这个问题,因为我遇到了完全相同的问题。
标签: asp.net-mvc-3