Как я могу использовать
Assert
(или другой класс Test?), Чтобы убедиться, что возникло исключение?
830
Как я могу использовать
Assert
(или другой класс Test?), Чтобы убедиться, что возникло исключение?
Ответы:
Для «Visual Studio Team Test» кажется, что вы применяете атрибут ExpectedException к методу теста.
Пример из документации здесь: пошаговое руководство по тестированию модулей с помощью Visual Studio Team Test
источник
Обычно ваш тестовый фреймворк будет иметь ответ на этот вопрос. Но если он недостаточно гибок, вы всегда можете сделать это:
Как указывает @Jonas, это НЕ работает для отлова базового исключения:
Если вам абсолютно необходимо перехватить Exception, вам нужно сбросить Assert.Fail (). Но на самом деле, это признак того, что вы не должны писать это от руки; проверьте свои тестовые рамки на наличие вариантов или посмотрите, можете ли вы выдать более значимое исключение для проверки.
Вы должны быть в состоянии адаптировать этот подход к тому, что вам нравится, включая указание, какие исключения нужно ловить. Если вы ожидаете только определенные типы, закончите
catch
блоки с помощью:источник
Мой предпочтительный метод для реализации этого - написать метод Throws и использовать его, как и любой другой метод Assert. К сожалению, .NET не позволяет вам писать метод статического расширения, поэтому вы не можете использовать этот метод, как если бы он действительно принадлежал сборке в классе Assert; просто сделайте другой под названием MyAssert или что-то подобное. Класс выглядит так:
Это означает, что ваш юнит-тест выглядит так:
Который выглядит и ведет себя намного больше, чем остальные синтаксисы вашего модульного теста.
источник
Assert.ThrowsException<T>
иAssert.ThrowsExceptionAsync<T>
- см blogs.msdn.microsoft.com/visualstudioalm/2017/02/25/...если вы используете NUNIT, вы можете сделать что-то вроде этого:
Также возможно сохранить выброшенное исключение для дальнейшей его проверки:
Смотрите: http://nunit.org/docs/2.5/exceptionAsserts.html
источник
Если вы используете MSTest, который изначально не имел
ExpectedException
атрибута, вы можете сделать это:источник
Будьте осторожны с использованием ExpectedException, так как это может привести к нескольким подводным камням, как показано здесь:
http://geekswithblogs.net/sdorman/archive/2009/01/17/unit-testing-and-expected-exceptions.aspx
И здесь:
http://xunit.github.io/docs/comparisons.html
Если вам нужно проверить исключения, есть и другие, которые не одобряются. Вы можете использовать метод try {act / fail} catch {assert}, который может быть полезен для платформ, которые не имеют прямой поддержки тестов исключений, кроме ExpectedException.
Лучшей альтернативой является использование xUnit.NET, которая является очень современной, ориентированной на будущее и расширяемой структурой модульного тестирования, которая извлекла уроки из всех других ошибок и усовершенствована. Одним из таких улучшений является Assert.Throws, который обеспечивает гораздо лучший синтаксис для утверждения исключений.
Вы можете найти xUnit.NET на github: http://xunit.github.io/
источник
MSTest (v2) теперь имеет функцию Assert.ThrowsException, которую можно использовать так:
Вы можете установить его с помощью nuget:
Install-Package MSTest.TestFramework
источник
В проекте, над которым я работаю, у нас есть другое решение, которое делает это.
Во-первых, мне не нравится атрибут ExpectedExceptionAttribute, потому что он принимает во внимание, какой вызов метода вызвал исключение.
Я делаю это с помощью вспомогательного метода вместо этого.
Тестовое задание
HelperMethod
Аккуратно, не правда ли;)
источник
Это атрибут метода тестирования ... вы не используете Assert. Выглядит так:
источник
Вы можете загрузить пакет из Nuget, используя: PM> Install-Package MSTestExtensions, который добавляет синтаксис Assert.Throws () в стиле nUnit / xUnit к MsTest.
Инструкции высокого уровня: загрузите сборку и наследуйте от BaseTest, и вы можете использовать синтаксис Assert.Throws () .
Основной метод для реализации Throws выглядит следующим образом:
Раскрытие: я собрал этот пакет.
Дополнительная информация: http://www.bradoncode.com/blog/2012/01/asserting-exceptions-in-mstest-with.html
источник
Вы можете достичь этого с помощью одной строки.
Если ваша операция
foo.bar()
асинхронная:Если
foo.bar()
не асинхронныйисточник
ArgumentException
например. Старый Try Catch и проверка ответа на исключение по-прежнему предпочтительнее, если у вас есть расширенные критерии для тестирования, но для многих моих случаев это очень помогает!Я не рекомендую использовать атрибут ExpectedException (поскольку он слишком ограничен и подвержен ошибкам) или писать блок try / catch в каждом тесте (так как он слишком сложен и подвержен ошибкам). Используйте хорошо разработанный метод assert - либо предоставленный вашей тестовой средой, либо напишите свой собственный. Вот что я написал и использую.
Пример использования:
НОТЫ
Возвращение исключения вместо поддержки обратного вызова проверки является разумной идеей, за исключением того, что это делает синтаксис вызова этого утверждения сильно отличающимся от других утверждений, которые я использую.
В отличие от других, я использую «распространяется» вместо «бросков», поскольку мы можем только проверить, распространяется ли исключение из вызова. Мы не можем напрямую проверить, что выброшено исключение. Но я полагаю, вы могли бы бросать изображения, чтобы означать: брошенный и не пойман.
ЗАКЛЮЧИТЕЛЬНАЯ МЫСЛЬ
Прежде чем перейти к такому подходу, я рассмотрел использование атрибута ExpectedException, когда тест проверял только тип исключения, и использование блока try / catch, если требовалась дополнительная проверка. Но я не только должен был думать о том, какую технику использовать для каждого теста, но и менять код с одной методики на другую по мере изменения потребностей не было тривиальной задачей. Использование одного последовательного подхода экономит умственные усилия.
Таким образом, в целом, этот подход спортивный: простота использования, гибкость и надежность (трудно сделать это неправильно).
источник
Помощник, предоставленный @Richiban выше, прекрасно работает, за исключением того, что он не обрабатывает ситуацию, когда выдается исключение, но не ожидаемый тип. Следующие адреса, которые:
источник
Поскольку вы упоминаете об использовании других тестовых классов, лучшим вариантом, чем
ExpectedException
атрибут, является использование Shoudly 's Should.Throw .Допустим, у нас есть требование, чтобы у клиента был адрес для создания заказа . Если нет,
CreateOrderForCustomer
метод должен привести кArgumentException
. Тогда мы могли бы написать:Это лучше, чем использование
ExpectedException
атрибута, потому что мы уточняем, что должно вызвать ошибку. Это делает требования в наших тестах более четкими, а также облегчает диагностику в случае неудачи теста.Обратите внимание, что есть также
Should.ThrowAsync
для тестирования асинхронных методов.источник
В качестве альтернативы вы можете попробовать протестировать исключения, которые фактически добавляются в следующих двух строках теста.
источник
Во встроенном модульном тестировании VS, если вы просто хотите убедиться, что выбрано «любое исключение», но не знаете тип, вы можете использовать catch all:
источник
Ну, я подведу итог тому, что все здесь говорили раньше ... В любом случае, вот код, который я построил в соответствии с хорошими ответами :) Осталось только скопировать и использовать ...
источник
Проверьте nUnit Docs для примеров о:
источник
Это будет зависеть от того, какой тестовый фреймворк вы используете?
Например, в MbUnit вы можете указать ожидаемое исключение с атрибутом, чтобы убедиться, что вы получаете исключение, которое вы действительно ожидаете.
источник
В случае использования NUnit , попробуйте это:
источник
Существует потрясающая библиотека под названием NFluent, которая ускоряет и облегчает способ написания ваших утверждений .
Довольно просто написать утверждение для выброса исключения:
источник
Хотя это старый вопрос, я хотел бы добавить новую мысль к обсуждению. Я расширил образец «Организовать, Действовать, Утвердить», «Ожидать», «Организовать, Действовать, Утвердить». Вы можете сделать указатель ожидаемого исключения, а затем утверждать, что он был назначен. Это кажется более чистым, чем выполнение ваших утверждений в блоке catch, оставляя ваш раздел Act в основном только для одной строки кода для вызова тестируемого метода. Вы также не должны
Assert.Fail();
илиreturn
из нескольких точек в коде. Любое другое выброшенное исключение вызовет сбой теста, потому что он не будет перехвачен, и если будет сгенерировано исключение вашего ожидаемого типа, но это было не то, что вы ожидали, Утверждение против сообщения или других свойств исключение поможет убедиться, что ваш тест не пройдет непреднамеренно.источник