Использование NUnit для тестирования любого типа исключения - PullRequest
19 голосов
/ 27 марта 2012

У меня есть класс, который создает файл.

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

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

В моих тестах я использую:

[Test]
public void CreateFile_InvalidFileName_ThrowsException()
{
    //Arrange
    var logger = SetupLogger("?\\");

    //Act

    //Assert
    Assert.Throws<Exception>(()=> logger.CreateFile());
 }

Однако в этом сценарии тест не выполняется, так как генерируется исключение ArgumentException.Я думал, добавив только исключение, это пройдет.

Есть ли способ сделать этот проход, просто используя Exception?

Ответы [ 7 ]

29 голосов
/ 27 марта 2012

Справка для Assert.Throws<> гласит, что «Проверяет, что делегат вызывает исключение определенного типа при вызове»

Попробуйте версию Assert.That, так как она поймает любую Exception:

private class Thrower
{
    public void ThrowAE() { throw new ArgumentException(); }
}

[Test]
public void ThrowETest()
{
    var t = new Thrower();
    Assert.That(() => t.ThrowAE(), Throws.Exception);
}
7 голосов
/ 16 февраля 2016

Для NUnit 2.5 и выше

// Allow both ApplicationException and any derived type
Assert.Catch<ApplicationException>(() => logger.CreateFile());

// Allow any kind of exception
Assert.Catch(() => logger.CreateFile());
2 голосов
/ 09 февраля 2018

Throws.InstanceOf () позволяет передавать базовый тип исключения вместо более конкретного производного типа.

[Test]
public void CreateFile_InvalidFileName_ThrowsException()
{
    //Arrange
    var logger = SetupLogger("?\\");

    //Act

    //Assert
    Assert.That(() => logger.CreateFile(), Throws.InstanceOf<Exception>());
}
2 голосов
/ 27 марта 2012

Ваши исключения должны быть детерминированными, и вы должны быть в состоянии написать тестовые случаи, которые устанавливают условия, при которых будет выбрасываться конкретное исключение, и вы должны проверить это конкретное исключение.

Таким образом, ваш тестдолжен быть переписан как

CreateFile_InvalidFileName_ThrowsArgumentException

и

Assert.Throws<ArgumentException>(() => logger.CreateFile());

Редактировать:

Кстати, я думаю, ваш конструктор должен обнаруживать неправильные имена файлов и выбрасывать их туда.И тогда это должен быть контракт для конструктора, что имя файла является действительным.

1 голос
/ 27 марта 2012

Напишите свой собственный метод и используйте его для проверки.

/// <summary>
    /// Throwses the specified action.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="action">The action.</param>
    /// <returns></returns>
    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;
    }
1 голос
/ 27 марта 2012

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

Если вам действительно нужно разрешить любое исключение для вашего теста,просто используйте стандартный блок try / catch и обычные подтверждения успеха / неудачи.

1 голос
/ 27 марта 2012

Вы можете пометить свой метод тестирования с атрибутом ExpectedException. Это должно сработать.

   [ExpectedException(typeof(Exception))]
    public void TestException()
    {

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...