Заставить NSubstitute генерировать исключения для каждого вызова

#c# #unit-testing #nsubstitute

#c# #модульное тестирование #национальный исследовательский институт

Вопрос:

Я использую NSubsitute для моделирования класса, который использует мой тестируемый метод. Я хочу убедиться, что мой метод не генерирует исключения, вызванные его зависимостями.

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

Я знаю, я могу «подготовить» макет для создания исключения, если будет вызван определенный метод. Но тогда мне также нужно проверить, был ли вообще вызван этот подготовленный метод, чтобы другие не могли изменять код без изменения модульного теста. Но это также означало бы начать тестирование алгоритма, чего я не хочу делать.

Редактировать: поскольку я пытаюсь издеваться над IRestClient из RestSharp, я нашел, по крайней мере, способ генерировать исключения для каждого вызова, который вернет Task<IRestResponse> — этого достаточно для моего варианта использования. Возможно, мой вопрос был недостаточно конкретным и подразумевал большую часть неправильного решения.

         var restClient = Substitute.For<IRestClient>();
        restClient.ReturnsForAll<Task<IRestResponse>>(t => throw new Exception("something did go wrong with the web api call"));
 

Комментарии:

1. «Есть ли способ заставить mocks генерировать исключение, независимо от того, какой из его методов вызывается?» в документах по исключениям говорится, что «Обратные вызовы могут использоваться для создания исключений при вызове члена. так что это не похоже на правду.

2. Это не поддерживается NSubstitute. Для этого может быть проще вручную создать тестовый дубль. Если вы используете VS, он может сгенерировать подтип, который по умолчанию используется для всех элементов NotImplementedException .

3. Разве это не вариант для передачи null в качестве службы вместо того, чтобы издеваться над ней? Таким образом, любой вызов метода вызовет исключение.

4. это, безусловно, хороший хак 😉

5. @DavidTchepak вы должны написать свой комментарий в качестве ответа, чтобы я мог принять и закрыть это

Ответ №1:

Это не поддерживается NSubstitute.

Для этого может быть проще вручную создать тестовый дубль. Если вы используете VS, он может сгенерировать подтип, который по умолчанию для всех членов вызывает NotImplementedException . (R # и Rider предоставляют аналогичные опции.)