@ У Виктора все правильно, но только для того, чтобы уточнить разницу.
Текущая проверка удостоверяется, что метод не был вызван с ЛЮБОЙ корзиной или ЛЮБОЙ информацией о доставке. Это может показаться чрезмерным, поскольку, возможно, этого может быть достаточно:
// 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>