Исключение для исключения из NUnit в MS TEST
У меня есть несколько тестов, где я проверяю имя параметра в исключении.
Как написать это в MS TEST?
ArgumentNullException exception =
Assert.Throws<ArgumentNullException>(
() => new NHibernateLawbaseCaseDataLoader(
null,
_mockExRepository,
_mockBenRepository));
Assert.AreEqual("lawbaseFixedContactRepository", exception.ParamName);
Я надеялся на более аккуратный способ, поэтому я могу избежать использования блока try catch в тестах.
Ответы
Ответ 1
public static class ExceptionAssert
{
public static T Throws<T>(Action action) where T : Exception
{
try
{
action();
}
catch (T ex)
{
return ex;
}
Assert.Fail("Expected exception of type {0}.", typeof(T));
return null;
}
}
Вы можете использовать метод расширения выше в качестве тестового помощника. Вот пример того, как его использовать:
// test method
var exception = ExceptionAssert.Throws<ArgumentNullException>(
() => organizations.GetOrganization());
Assert.AreEqual("lawbaseFixedContactRepository", exception.ParamName);
Ответ 2
Бесстыдный плагин, но я написал простую сборку, которая упрощает и облегчает утверждение исключений и сообщений об исключениях в MSTest с использованием синтаксиса Assert.Throws() в стиле nUnit/xUnit.
Вы можете загрузить пакет из Nuget, используя: PM > Install-Package MSTestExtensions
Или вы можете увидеть полный исходный код здесь: https://github.com/bbraithwaite/MSTestExtensions
Инструкции высокого уровня, загрузите сборку и наследуйте от BaseTest, и вы можете использовать синтаксис Assert.Throws().
Основной метод реализации Throw выглядит следующим образом:
public static void Throws<T>(Action task, string expectedMessage, ExceptionMessageCompareOptions options) where T : Exception
{
try
{
task();
}
catch (Exception ex)
{
AssertExceptionType<T>(ex);
AssertExceptionMessage(ex, expectedMessage, options);
return;
}
if (typeof(T).Equals(new Exception().GetType()))
{
Assert.Fail("Expected exception but no exception was thrown.");
}
else
{
Assert.Fail(string.Format("Expected exception of type {0} but no exception was thrown.", typeof(T)));
}
}
Подробнее здесь.
Ответ 3
Поскольку атрибут MSTest [ExpectedException]
не проверяет текст в сообщении, лучше всего попробовать... уловить и установить Assert в свойстве Message/ParamName исключения.