2011-01-14 4 views
0

Я трачу более 2 часов на это ... Я не могу понять, почему этот тест PASSING. Я имею в виду .. он не должен возвращать представление «Завершено», но в тесте он делает! Он говорит «Ожидаемый« string.Empty », но возвратил« Completed », однако, чтобы кредитная карточка прошла. Код безопасности должен быть« 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; 
    } 
} 

ответ

0

тест потерпит неудачу, если ShouldBeDefaultView() броски.

1

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

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

Так я должен был установить Ложная для этого конкретного теста, добавив:

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

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

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

Спасибо.

Смежные вопросы