【问题标题】:MVC3 ViewResult.ViewData Error: 'Cannot find the method on the object instance'MVC3 ViewResult.ViewData 错误:'找不到对象实例上的方法'
【发布时间】: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


【解决方案1】:

我能够解决这个问题,似乎我的测试项目正在引用 MVC 4,而 Web 项目正在引用 MVC 3。我使测试项目引用了 MVC 3,现在它工作得很好

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-04
    • 2012-02-03
    • 2021-11-01
    • 2015-12-29
    • 2021-04-14
    • 2013-12-07
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多