Могу ли я использовать Moq, чтобы проверить, вызван ли метод издевательства со специальными значениями в комплексном параметре?
Итак, предположим, что я издеваюсь над следующим классом:
public class ClassAParams
{
public int RequestedId { get; set; }
public string SomeValue { get; set; }
}
public class ClassA
{
public void ExecuteAction(ClassAParams executeParams) {}
}
Теперь скажите, что у меня есть еще один класс (пусть его называют ClassB
), для которого я создаю модульное тестирование, и я хочу убедиться, что при вызове ClassB.Execute()
этот ClassB
вызывает ClassA.ExecuteAction()
, но я хотите, чтобы параметр, вызываемый этим методом, имел значение ClassAParams.RequestedId
1.
Обычно я бы справился с этим, выполнив myMock.Verify(x => x.ExecuteAction(new ClassAParams { RequestedId = 1, SomeValue = "something" }));
Проблема заключается в том, что я не хочу проверять значение параметра SomeValue
или любые другие ClassAParams
свойства в этом unit test. Другие свойства будут проверяться в других модульных тестах, но для проверки того, что он вызвал правильные свойства в каждом unit test (даже если мне не все в порядке с конкретными модульными тестами), обслуживание устройства будет раздражать.
Можно ли использовать Moq для проверки того, что структура, которая передается в mocked-метод, имеет только определенные свойства в качестве определенного значения и игнорирует остальные?
Ответы
Ответ 1
Для mock.Verify
существует перегрузка, которая позволяет вам что-то тестировать. Вот пример, который должен работать для вашего теста.
classA.Verify(
a => a.ExecuteAction(
It.Is<ClassAParams>(p => p.RequestedId == 12)
)
);
Что означает "Для любого ClassAParams
, переданного как аргумент, проверьте RequestId
равно 12".