Почему этот тестовый блок прошел? - 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;
    }
}

1 Ответ

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

Нашел решение для этого.Объект mocks не имеет никакой реализации.(Что я должен был знать до этого)

...