Почему этот тестовый блок прошел? - PullRequest
0 голосов
/ 14 января 2011

Я трачу на это более 2 часов ... Я не могу понять, почему этот тест проходит. Я имею в виду .. это не должно возвращать представление "Завершено", но в тесте это делает! В нем указано «Ожидается« string.Empty », но возвращается« Завершено », однако кредитная карта прошла. Код безопасности должен быть« test », которого вообще нет в тесте. Поэтому он должен вернуть представление по умолчанию (которое похоже на view ();).

Что я делаю не так? это мой тест не так? или логика контроллера?

Большое спасибо.


[Test]
public void Cannot_Check_Out_If_Credit_Card_Failed_To_Process()
{
 var mockOrderSubmitter = new Mock<IOrderSubmitter>();
 var mockCreditCardProcessor = new Mock<ICreditCardProcessor>();

 // Arrange: Given a user has a non-empty cart
 var cart = new Cart();
 cart.AddItem(new Product(), 1);

 // Arrange: ... but the credit card failed to process
 var cartController = new CartController(null, mockOrderSubmitter.Object, mockCreditCardProcessor.Object);
 var result = cartController.CheckOut(cart, new ShippingDetails(), new CreditCard() { SecurityCode = "123" });

 // Assert
 result.ShouldBeDefaultView();
}

[HttpPost]
public ActionResult CheckOut(Cart cart, ShippingDetails shippingDetails, CreditCard creditCard)
{
  // Empty carts can't be checked out
  if (cart.Lines.Count == 0)
      ModelState.AddModelError("Cart", "Sorry, your cart is empty!");

  // Everything is valid
  if (ModelState.IsValid)
  {
      // Effectue le paiement.
      TransactionResult result = creditcardProcessor.TakePayment(creditCard, cart.ComputeTotalValue());
      if (result == TransactionResult.Success)
      {
          // Envoi la commande
          orderSubmitter.SubmitOrder(cart, shippingDetails);
          cart.Clear();
          return View("Completed");
      }
      else
      {
          ModelState.AddModelError("CreditCard", "Sorry, we couldn't process your credit card, please verify your credit card details and retry.");
          return View(new CheckOutViewModel());
      }

  }
  else // Something was invalid
      return View(new CheckOutViewModel());
}

public class MainCreditCardProcessor : ICreditCardProcessor
{
    public TransactionResult TakePayment(CreditCard card, decimal amount)
    {
        if (card.SecurityCode == "test")
            return TransactionResult.Success;
        else
            return TransactionResult.TransactionDeclined;
    }
}

Ответы [ 2 ]

1 голос
/ 17 января 2011

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

Проблема была с моим тестом. Так как фиктивные объекты являются пустыми объектами без методов внутри, логики ноль. Это означает, что тест на самом деле не использует экземпляр MainCreditCarDProcessor. (Я не знал об этом)

Так что мне пришлось настроить макет для этого конкретного теста, добавив:

// Arrange: Given we have a creditcard processor that return TransactionDeclined.
mockCreditCardProcessor.SetReturnsDefault(TransactionResult.TransactionDeclined);

Чтобы заставить его возвращать TransactionDeclined, через это не происходит «форсирование», так как это макет, вы просто устанавливаете его так, чтобы оно возвращало это значение, в противном случае, я думаю, он вернет найденное по умолчанию значение, которое в данном случае было 0 первый элемент перечисления или null для метода другого типа, который возвращает значения другого типа.

Если я сказал что-то не так, поправьте меня.

Спасибо.

0 голосов
/ 14 января 2011

Тест не пройден, если ShouldBeDefaultView() сгенерирует.

...