MVC3 ViewResult.ViewData错误:'无法在对象实例上找到该方法'

时间:2011-12-27 22:52:14

标签: asp.net-mvc-3

我正在通过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论坛上发布的,但没有得到回复。

1 个答案:

答案 0 :(得分:1)

我能够解决这个问题,看来我的测试项目引用了MVC 4而web项目引用了MVC 3.我让测试项目引用了MVC 3,现在它工作得很好