Используя MSTest, как я могу проверить точное сообщение об ошибке, прибывающее из метода тестирования? Я знаю [ExpectedException(typeof(ApplicationException), error msg)]
не сравнивает сообщение об ошибке, прибывающее из моего метода тестирования, хотя в другой платформе модульного теста это делает.
Один способ решить эту проблему состоит в том, чтобы записать мой модульный тест с помощью некоторого блока выгоды попытки, но снова я должен записать 4 строки больше.
Есть ли любой самый умный способ проверить сообщение об ошибке.
С наилучшими пожеланиями, Pritam
В MSTest нет встроенного способа сделать это. Это примерно так же "элегантно", как и получается:
[TestMethod]
public void Test8()
{
var t = new Thrower();
try
{
t.DoStuffThatThrows();
Assert.Fail("Exception expected.");
}
catch (InvalidOperationException e)
{
Assert.AreEqual("Boo hiss!", e.Message);
}
}
Однако, вы можете рассмотреть возможность переноса xUnit.NET's Assert.Throws API на пользовательскую библиотеку - это то, что мы сделали.
Вы также можете пойти в Microsoft Connect и проголосовать за это предложение.
.MbUnit также может это сделать:
[Test]
[Row(ExpectedExceptionMessage="my message")]
void TestBlah(...
С помощью MSTest, ты не можешь этого сделать.
Вы уже знаете решение этой проблемы: установить сообщение об исключении в блоке catch.
Используйте этот маленький вспомогательный класс:
public static class ExceptionAssert
{
public static void Throws<TException>(Action action, string message)
where TException : Exception
{
try
{
action();
Assert.Fail("Exception of type {0} expected; got none exception", typeof(TException).Name);
}
catch (TException ex)
{
Assert.AreEqual(message, ex.Message);
}
catch (Exception ex)
{
Assert.Fail("Exception of type {0} expected; got exception of type {1}", typeof(TException).Name, ex.GetType().Name);
}
}
}
Использование:
Foo foo = new Foo();
foo.Property = 42;
ExceptionAssert.Throws<InvalidOperationException>(() => foo.DoSomethingCritical(), "You cannot do anything when Property is 42.");
Преимущество явного перехвата исключений состоит в том, что тест не удается, когда другой член (например, во время инициализации) бросает исключение.
Обновление: Ой... смотрите, что вы хотите, чтобы это было в MSTest. Извините. Скорость чтения и введение в заблуждение вашим заголовком.
Попробуйте этот проект расширения из Callum Hibbert и посмотрите, работает ли он.
Старый ответ:
Вы можете сделать это с NUnit 2.4 и выше. Смотрите документацию о ExpectedException здесь
[ExpectedException( typeof( ArgumentException), ExpectedMessage="unspecified", MatchType=MessageMatch.Contains )]
public void TestMethod()
{
...
MatchType может быть Точным (по умолчанию), Содержит или Регекс... который в основном обрабатывает 80% случаев использования. Также существует продвинутый метод обработчика исключений, если верификация становится слишком сложной... никогда не использовался лично... не нуждался в этом пока.