Ошибка NSubstitute UnexpectedArgumentMatcherException

Я получаю следующую ошибку:

NSubstitute.Exceptions.UnexpectedArgumentMatcherException: «Сопоставители аргументов (Arg.Is, Arg.Any) следует использовать только вместо аргументов-членов. Не используйте в операторе Returns() или где-либо еще за пределами вызова члена. Правильное использование:
sub.MyMethod(Arg.Any()).Returns("hi") Неправильное использование:
sub.MyMethod("hi").Returns(Arg.Any())'

При попытке смоделировать следующий интерфейс:

public interface IMyDate
{
    DateTime GetDate();
}

Вот где я издеваюсь над этим:

var myDate = Substitute.For<IMyDate>();
myDate.GetDate().Returns(testDate); // Error thrown here

Пожалуйста, кто-нибудь может объяснить, что я делаю неправильно?

var myDate = Substitute.For<IMyDate>();
myDate.GetDate().Returns(new DateTime(2018, 04, 05)); // Error thrown here

Дает тот же результат.


person Community    schedule 05.04.2018    source источник


Ответы (4)


Это может быть из-за проблемы с более ранним тестом. См. этот ответ для некоторых шагов по отслеживанию этой проблемы. Я включил снимок этого ответа ниже:

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

К сожалению, это может быть довольно сложно отладить. Первый шаг — посмотреть, возникает ли проблема, когда вы запускаете все тесты в этом приспособлении. Если это так, проверьте все случаи использования Arg.Is|Any в этом приспособлении, начиная с того, которое запускается непосредственно перед неудачным тестом (если ваша тестовая среда использует предсказуемый порядок тестов, в противном случае вам нужно будет просмотреть журналы тестов, чтобы посмотрите, какие тесты продолжают неудачный).

Если этого не происходит с этим фикстурой, вам нужно предварительно просмотреть фикстуры, которые запускаются, чтобы увидеть, откуда берется оставшийся сопоставитель аргументов. Скорее всего, это где-то рядом с провальным тестом.

Надеюсь это поможет. Из положительных новостей следующая версия NSubstitute (v4) предложит больше помощи в этих случаях.

См. также: Как не использовать сопоставители аргументов.

person David Tchepak    schedule 05.04.2018

Скорее всего, testDate — это сопоставление аргументов (Arg.Is или Arg.Any)

Сообщение об исключении говорит вам использовать сопоставители аргументов только как аргументы вызова члена, а не как возвращаемые значения, но вы используете его как возвращаемое значение...

«Не используйте в операторе Returns () или где-либо еще за пределами вызова члена»

Пытаться

var testDate = new DateTime(); //<-- try setting the desired date as needed
var myDate = Substitute.For<IMyDate>();
myDate.GetDate().Returns(testDate);

Ссылка NSubstitute: сопоставители аргументов

person MrVoid    schedule 05.04.2018
comment
Это дает тот же результат. Смотрите обновление в моем вопросе. - person ; 05.04.2018
comment
@qwerty Я очень сомневаюсь, что ошибка будет такой же. Что за новая ошибка вылетает? - person Nkosi; 05.04.2018
comment
Я только что протестировал его локально, и он отлично работает, как сказал @NKosi, возможно, это другая ошибка. - person MrVoid; 05.04.2018
comment
Не знаю, что вам сказать - та же ошибка. testDate уже заранее была жестко закодирована. - person ; 05.04.2018
comment
Это странно, убедитесь, что перекомпиляция работает нормально, и вы не получаете старые двоичные файлы, исходный код которых был другим. - person MrVoid; 05.04.2018
comment
Нет - попытался перезапустить VS и удалить каталоги bin и obj. - person ; 05.04.2018

Чтобы решить эту проблему, вам нужно определить метод, который ее вызывает, это может быть метод, который вы пытаетесь вызвать, или другой вложенный метод внутри метода, который вы пытаетесь вызвать...

Создание этого метода виртуальным устраняет эту проблему.

Если вы заменили класс, а не интерфейс, убедитесь, что вызов вашего заменителя был на виртуальном/абстрактном члене. Возвращаемые значения нельзя настроить для невиртуальных или неабстрактных элементов.

person Noob    schedule 29.11.2019

В нашем случае случайный тест отправлял это сообщение об ошибке, но только при выполнении всего теста. Мы обнаружили эту ошибку при переходе с 4.6.1 на netcore 3.1.

Проблема заключалась в том, что тестовый класс без какой-либо замены использовал выражение Arg.Any<int>() по неизвестной причине.

Удаление этого непроверенного фрагмента кода Arg.Any<int>() было решением.

person espumita    schedule 22.07.2021