Могу ли я использовать Moq для проверки того, что смоделированный метод был вызван с определенными значениями в сложном параметре? - PullRequest
39 голосов
/ 11 июня 2011

Итак, предположим, я издеваюсь над следующим классом:

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 в этом модульном тесте. Другие свойства будут проверены в других модульных тестах, но необходимость проверять, чтобы он вызывался с правильными свойствами в каждом модульном тесте (даже если меня не волнует объем конкретных модульных тестов), сделает обслуживание модуля раздражающим.

Есть ли способ использовать Moq для проверки того, что структура, которая передается в смоделированный метод, имеет только определенные свойства в качестве определенного значения, а остальные игнорировать?

1 Ответ

67 голосов
/ 11 июня 2011

Для mock.Verify существует перегрузка, которая позволяет вам что-то тестировать. Вот пример, который должен работать для вашего теста.

classA.Verify(
    a => a.ExecuteAction(
        It.Is<ClassAParams>(p => p.RequestedId == 12)
    )
);

Что означает "Для любого ClassAParams, переданного в качестве аргумента, убедитесь, что RequestId равно 12" .

...