It.IsAny <Cart>(), It.IsAny <ShippingDetails>(), Times.Never ().Что они делают? - PullRequest
3 голосов
/ 21 сентября 2011

Интересно, не могли бы вы помочь мне понять следующую строку:

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

Ответы [ 3 ]

5 голосов
/ 21 сентября 2011

It.IsAny<Cart> соответствует любому значению типа Корзина. Поскольку у вас есть Times.Never, вы фактически проверяете, что метод никогда не вызывался с двумя параметрами (Card, ShippingDetails).

2 голосов
/ 21 сентября 2011

@ У Виктора все правильно, но только для того, чтобы уточнить разницу.

Текущая проверка удостоверяется, что метод не был вызван с ЛЮБОЙ корзиной или ЛЮБОЙ информацией о доставке. Это может показаться чрезмерным, поскольку, возможно, этого может быть достаточно:

// 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> позволяет вам проверить, что метод не вызывался независимо от аргументов, иначе проверка может произойти только с этими конкретными экземплярами в качестве аргументов.

EDIT

Чтобы ответить на комментарий. Представьте себе еще один тест, в котором вместо этого вы хотите проверить, что заказ был обработан, и что он был обработан с правильными аргументами, а не с информацией о корзине и отгрузке некоторых других пользователей:

// 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>

1 голос
/ 21 сентября 2011

Проверяется, что метод ProcessOrder никогда не вызывался с использованием любого типа Cart и ShippingDetails в качестве аргументов во время теста.

...