фиктивный метод, ожидающий список - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть метод, который ожидает набор строк и который я хочу смоделировать:

bool DoSomething(IEnumerable<string> myList) { ... }

Я хочу смоделировать каждый вызов этого метода, имеющий любую коллекцию со следующими элементами: ["DLKM"], не имеет значения, является ли тип коллекции массивом, списком или чем-то еще.

Для этого я создал средство сопоставления аргументов, используя NSubstitute:

var modellarten = Arg.Is<IEnumerable<string>>(x => !new[] { "DLKM" }.Except(x).Any());

, которое соответствует любой коллекции строк, которые содержат только строку "DLKM".

Это мой макет:

var mock = Substitute.For<IMyInterface>();
mock.DoSomething(modellarten).Returns(true);

Однако, как только я высмеиваю несколько методов, используя один и тот же аргумент arg-matcher, вызов DoSomething возвращает значение по умолчанию false:

var mock = Substitute.For<IMyInterface>();
mock.Init(modellarten).Returns(true);
mock.DoSomething(modellarten).Returns(true);

Итак, я полагаю, это связано с замыканием внутри совпадения. Но я не знаю, как смоделировать оба метода, не повторяя код для modellarten:

var mock = Substitute.For<IMyInterface>();
mock.Init(Arg.Is<IEnumerable<string>>(x => !new[] { "DLKM" }.Except(x).Any())).Returns(true);
mock.DoSomething(Arg.Is<IEnumerable<string>>(x => !new[] { "DLKM" }.Except(x).Any())).Returns(true);

1 Ответ

0 голосов
/ 24 апреля 2020

Вместо того, чтобы помещать сопоставление в одну переменную, просто извлеките код в метод, который вы вызываете при каждой макете:

IMyInterface MockInterface()
{
    var mock = Substitute.For<IMyInterface>();
    mock.Init(MatchCollection()).Returns(true);
    mock.DoSomething(MatchCollection()).Returns(true);
    return mock;
}
IEnumerable<string> MatchCollection() 
{
    return Arg.Is<IEnumerable<string>>(x => !new[] { "DLKM" }.Except(x).Any());
}

Это создаст новое сопоставление при каждом вызове вместо использования ранее созданного один.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...