Подтвердить что ты не робот

Использование NUnit для тестирования любого типа исключения

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

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

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

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

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

    //Act

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

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

Есть ли способ сделать этот проход только с помощью Exception?

4b9b3361

Ответ 1

В справке 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);
}

Ответ 2

Для NUnit 2.5 и выше

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

// Allow any kind of exception
Assert.Catch(() => logger.CreateFile());

Ответ 3

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

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

CreateFile_InvalidFileName_ThrowsArgumentException

и

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

Edit:

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

Ответ 4

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

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

    }

Ответ 5

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

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

Ответ 6

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

/// <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;
    }

Ответ 7

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

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

    //Act

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