2011-09-21 73 views
3

我不知道,如果你能幫助我理解下面一行:It.IsAny <Cart>(),It.IsAny <ShippingDetails>(),Times.Never()。他們在做什麼?

 mock.Verify(m => m.ProcessOrder(It.IsAny<Cart>(), 
             It.IsAny<ShippingDetails>()), 
         Times.Never()); 

測試方法:

[TestMethod] 
public void Cannot_Checkout_Empty_Cart() 
{ 
    // Arrange - create a mock order processor 
    Mock<IOrderProcessor> mock = new Mock<IOrderProcessor>(); 

    // Arrange - create an empty cart 
    Cart cart = new Cart(); 

    // Arrange - create shipping details 
    ShippingDetails shippingDetails = new ShippingDetails(); 

    // Arrange - create an instance of the controller 
    CartController target = new CartController(null, mock.Object); 

    // Act 
    ViewResult result = target.Checkout(cart, shippingDetails); 

    // Assert - check that the order hasn't been passed on to the processor 
    mock.Verify(m => m.ProcessOrder(It.IsAny<Cart>(), It.IsAny<ShippingDetails>()), Times.Never()); 

    // Assert - check that the method is returning the default view 
    Assert.AreEqual("", result.ViewName); 

    // Assert - check that we are passing an invalid model to the view 
    Assert.AreEqual(false, result.ViewData.ModelState.IsValid); 
} 

回答

2

@Wiktor有正確的,但只是爲了澄清其差異。

目前的檢查是確保該方法還沒有被調用任何車或任何運輸細節。這似乎過度,因爲也許這可能已經足夠:

// Assert - check that the order hasn't been passed on to the processor 
mock.Verify(m => m.ProcessOrder(cart, shippingsDetails), Times.Never()); 

畢竟這是有可能的處理將與給定的車和運輸細節來完成。但是,可能已經克隆了購物車,或者某些裝運詳細信息可能已從用戶首選項或某物中加載,並且It.IsAny<T>允許您檢查該方法是否被調用,無論參數如何,否則驗證會只有在這些特定實例作爲參數時纔會發生

編輯

要回答的評論。試想一下,另一個試驗中,而不是你想檢查的順序進行處理,而且它是用正確的參數,而不是用一些不同的用戶購物車和運輸細節處理:

// Arrange - create an empty cart 
Cart cart = new Cart(); 

// Arrange - create shipping details 
ShippingDetails shippingDetails = new ShippingDetails(); 

// Arrange - create an instance of the controller 
CartController target = new CartController(null, mock.Object); 

// Act 
ViewResult result = target.Checkout(cart, shippingDetails); 

//Assert - check the order was processed once with the 
//correct cart and shipping details 
mock.Verify(m => m.ProcessOrder(cart, shippingDetails), Times.Once()); 

現在這個測試失敗,如果ProcessOrder方法沒有與期望的購物車和貨運細節完全相同。如果碰巧使用其他用戶的購物車或運送詳情,則測試將失敗。

希望這清楚了明確指定的參數和使用It.IsAny<T>

+0

之間的區別「否則驗證將只作爲參數的特定情況下發生」,很抱歉,但是這絕對不會發生,對吧?它將如何匹配實例?它不依賴於任何值類型的標準,我是對的嗎? – SomeUser

+0

太好了,謝謝.. – SomeUser

5

It.IsAny<Cart>型手推車上的任何值匹配。由於您有Times.Never,因此您實際驗證該方法具有從未被稱爲與兩個參數(卡,ShippingDetails)。

1

據驗證,該方法是ProcessOrder從未使用任何類型的CartShippingDetails如在測試期間參數調用。