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

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

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

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

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

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

    //Act

    //Assert
    Assert.Throws<Exception>(()=> logger.CreateFile());
 }
в этом случае тест не исключение ArgumentException. Я думал, добавив только исключение, это пройдет.

есть ли способ сделать это пройти просто используя Исключение?

7 ответов


помощь 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);
}

для NUnit 2.5 и выше

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

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

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

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

CreateFile_InvalidFileName_ThrowsArgumentException

и

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

Edit:

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


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

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


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

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

    }

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

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

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

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

    //Act

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