В MSTest, Как я могу проверить точное использование сообщения об ошибке [ExpectedException (typeof (ApplicationException))]

Используя MSTest, как я могу проверить точное сообщение об ошибке, прибывающее из метода тестирования? Я знаю [ExpectedException(typeof(ApplicationException), error msg)] не сравнивает сообщение об ошибке, прибывающее из моего метода тестирования, хотя в другой платформе модульного теста это делает.

Один способ решить эту проблему состоит в том, чтобы записать мой модульный тест с помощью некоторого блока выгоды попытки, но снова я должен записать 4 строки больше.

Есть ли любой самый умный способ проверить сообщение об ошибке.

С наилучшими пожеланиями, Pritam

35
задан Jim Aho 9 February 2016 в 16:27
поделиться

5 ответов

В 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 и проголосовать за это предложение.

.
4
ответ дан 27 November 2019 в 06:56
поделиться

MbUnit также может это сделать:

[Test]
[Row(ExpectedExceptionMessage="my message")]
void TestBlah(...
0
ответ дан 27 November 2019 в 06:56
поделиться

С помощью MSTest, ты не можешь этого сделать.

Вы уже знаете решение этой проблемы: установить сообщение об исключении в блоке catch.

0
ответ дан 27 November 2019 в 06:56
поделиться

Используйте этот маленький вспомогательный класс:

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.");

Преимущество явного перехвата исключений состоит в том, что тест не удается, когда другой член (например, во время инициализации) бросает исключение.

15
ответ дан 27 November 2019 в 06:56
поделиться

Обновление: Ой... смотрите, что вы хотите, чтобы это было в MSTest. Извините. Скорость чтения и введение в заблуждение вашим заголовком.

Попробуйте этот проект расширения из Callum Hibbert и посмотрите, работает ли он.

Старый ответ:

Вы можете сделать это с NUnit 2.4 и выше. Смотрите документацию о ExpectedException здесь

[ExpectedException( typeof( ArgumentException), ExpectedMessage="unspecified", MatchType=MessageMatch.Contains )]
public void TestMethod()
{
...

MatchType может быть Точным (по умолчанию), Содержит или Регекс... который в основном обрабатывает 80% случаев использования. Также существует продвинутый метод обработчика исключений, если верификация становится слишком сложной... никогда не использовался лично... не нуждался в этом пока.

-1
ответ дан 27 November 2019 в 06:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: