MVC3 ViewResult.ViewData Ошибка: «Не удается найти метод в экземпляре объекта» - PullRequest
1 голос
/ 28 декабря 2011

Я работаю над книгой Адама Фримена и Стивена Сандерсона (Apress) Pro ASP.Net MVC3 Framework.В конце главы 8 мы создали приложение для корзины покупок и модульные тесты.У меня не было проблем с этим, но сейчас модульное тестирование не проходит по причине, которую я не понимаю.Ошибки в книге не упоминаются об этой проблеме.

Я использую 64-разрядную версию Windows 7, .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 ».Расширяя информацию, я вижу для «base» и «Message» «Не удается найти метод на экземпляре объекта».В подробностях о неудачном модульном тесте говорится: Метод теста 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, но не получило ответа.

1 Ответ

1 голос
/ 25 августа 2012

Я смог решить эту проблему, похоже, мой тестовый проект ссылался на MVC 4, а веб-проект ссылался на MVC 3. Я сделал тестовый проект для ссылки на MVC 3, и теперь он работает просто отлично

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...