2011-01-14 75 views
0

我花了2個多小時在這...我無法弄清楚爲什麼這個測試是通過。我的意思是......它不應該返回視圖「已完成」,但在測試中它!它說預期的「string.Empty」,但是返回「完成」,但是要讓信用卡通過,安全代碼需要是「測試」,這在測試中根本就沒有。所以它應該返回默認視圖(就像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 ,,通過這不是「逼」,因爲它是一個模擬你只是設置它返回該值,否則我想它會返回它找到的默認值..在這種情況下,這是0的枚舉的第一個元素或null爲其他類型的方法返回其他類型的值。

如果我說的是錯的,請糾正我。

謝謝。

相關問題