我正在通過本書的方式,亞當弗里曼和斯蒂芬桑德森(Apress)的臨ASP.Net MVC3框架。在第8章結束時,我們創建了購物車應用程序和單元測試。這一點我沒有問題,但現在單元測試失敗了,原因我不明白。這本書的勘誤沒有提到這個問題。MVC3 ViewResult.ViewData錯誤:'無法找到對象實例的方法'
我正在使用Windows 7 64位,.Net 4,VS 2010 Ultimate。
一個ShippingDetails類的實例(送貨地址等)和一個Cart類的實例(訂購的物品)被傳遞給CartController的「Checkout」動作,它返回一個ViewResult。如果ModelState有效,則處理完成,購物車被清除並返回查看(「完成」)。如果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拋出異常:System.EntryPointNotFoundException:未找到入口點。
這裏是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論壇上,但沒有得到任何迴應。
有你設法解決這個問題我有完全相同的問題。 – Paleta 2012-08-25 02:43:28