2011-01-14 11 views
0

Ich verbringe mehr als 2 Stunden damit ... Ich kann nicht herausfinden, warum dieser Test PASSING ist. Ich meine .. es sollte nicht die Ansicht "Completed" zurückgeben, aber im Test tut es das! Es heißt Erwartete "string.Empty", aber zurückgegeben "Completed" aber für die Kreditkarte zu übergeben .. der Sicherheitscode muss "test" sein, das ist überhaupt nicht im Test. Also sollte es die Standardansicht (wie view();) zurückgeben.Warum ist diese Testeinheit bestanden?

Was mache ich falsch? es ist mein Test, der falsch ist? oder die Steuerungslogik?

Vielen Dank.


[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; 
    } 
} 

Antwort

0

Der Test schlägt fehl, wenn ShouldBeDefaultView() wirft.

1

Ich fand eine Lösung für mein Problem. Um anderen zu helfen, die das gleiche Problem haben, werde ich es erklären.

Das Problem war mit meinem Test. Da Mock-Objekte leere Objekte sind, die keine Methoden enthalten, gibt es keine Logiken. Das bedeutet, dass der Test tatsächlich keine Instanz des MainCreditCarDProzessors verwendet. (Ich wusste nicht, dass)

Also ich Setup hatte die Mock für diesen besonderen Test durch Zugabe von:

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

es zu zwingen TransactionDeclined zurückzukehren ,, durch diese nicht „zwingen“, da es ist ein Mock Sie haben es nur eingerichtet, um diesen Wert zurückzugeben, sonst denke ich, es wird den Standardwert zurückgeben, die es gefunden .. was in diesem Fall war 0 das erste Element der Aufzählung oder null für andere Art von Methode, die andere Art von Werten zurückgeben .

Wenn etwas, was ich sagte, falsch ist, bitte korrigieren Sie mich.

Danke.