Недавно я обнаружил довольно интересное поведение библиотеки Moq
(4.5.21) в одном из моих проектов на C#. Ниже приведен класс, который я пытаюсь проверить.Проверка вызовов методов с использованием другого состояния объекта с использованием Moq
public class Order
{
public string State { get; set; }
}
public interface IOrderService
{
Task UpdateOrderAsync(Order order);
}
public class Program
{
public async Task RunAsync(IOrderService orderService)
{
var order = new Order();
order.State = "new";
await orderService.UpdateOrderAsync(order);
order.State = "open";
await orderService.UpdateOrderAsync(order);
}
}
Ниже мой TestClass:
[TestMethod]
public async Task TestMethod()
{
var mock = new Mock<IOrderService>();
await new Program().RunAsync(mock.Object);
mock.Verify(x => x.UpdateOrderAsync(It.Is<Order>(o => o.State == "new")), Times.Once);
mock.Verify(x => x.UpdateOrderAsync(It.Is<Order>(o => o.State == "open")), Times.Once);
}
Я получаю следующий вывод:
Moq.MockException:
Expected invocation on the mock once, but was 0 times: x => x.UpdateOrderAsync(It.Is<Order>(o => o.State == "new"))
Configured setups:
x => x.UpdateOrderAsync(It.Is<Order>(o => o.State == "new")), Times.Once
x => x.UpdateOrderAsync(It.Is<Order>(o => o.State == "open")), Times.Once
Performed invocations:
IOrderService.UpdateOrderAsync(Order<State:open>)
IOrderService.UpdateOrderAsync(Order<State:open>)
Я бы ожидать, что я могу Verify
, что метод был назван Once
каждый раз с object
с разными State
. Любые мысли о том, что я делаю неправильно?
Спасибо!