Я проверял вызовы таким же образом - я считаю, что это правильный способ сделать это.
mockSomething.Verify(ms => ms.Method(
It.IsAny<int>(),
It.Is<MyObject>(mo => mo.Id == 5 && mo.description == "test")
), Times.Once());
Если ваше лямбда-выражение становится громоздким, вы можете создать функцию, которая принимает MyObject
в качестве входных данных и выводит true
/ false
...
mockSomething.Verify(ms => ms.Method(
It.IsAny<int>(),
It.Is<MyObject>(mo => MyObjectFunc(mo))
), Times.Once());
private bool MyObjectFunc(MyObject myObject)
{
return myObject.Id == 5 && myObject.description == "test";
}
Также следует помнить об ошибке в Mock, когда в сообщении об ошибке говорится, что метод вызывался несколько раз, когда он вообще не вызывался. Возможно, они уже исправили это, но если вы видите это сообщение, вы можете проверить, действительно ли был вызван метод.
РЕДАКТИРОВАТЬ: Вот пример вызова проверки несколько раз для тех сценариев, где вы хотите проверить, что вы вызываете функцию для каждого объекта в списке (например).
foreach (var item in myList)
mockRepository.Verify(mr => mr.Update(
It.Is<MyObject>(i => i.Id == item.Id && i.LastUpdated == item.LastUpdated),
Times.Once());
Тот же подход к настройке ...
foreach (var item in myList) {
var stuff = ... // some result specific to the item
this.mockRepository
.Setup(mr => mr.GetStuff(item.itemId))
.Returns(stuff);
}
Таким образом, каждый раз, когда GetStuff вызывается для этого itemId, он возвращает материал, специфичный для этого элемента. Кроме того, вы можете использовать функцию, которая принимает itemId в качестве входных данных и возвращает вещи.
this.mockRepository
.Setup(mr => mr.GetStuff(It.IsAny<int>()))
.Returns((int id) => SomeFunctionThatReturnsStuff(id));
Еще один метод, который я видел в блоге некоторое время назад (возможно, Фил Хаак?), Имел настройку, возвращающуюся из какого-либо объекта dequeue - каждый раз, когда вызывается функция, он вытягивает элемент из очереди.