Тестирование обработки исключений - PullRequest
0 голосов
/ 07 мая 2018

Я должен проверить следующий код.

public void SampleMethod(FooBarObject fooBarObject) {
    try { 
        fooBarObject.Name = "Never forget a towel";
        fooBarObject.Number = 42;
    }
    catch (NullReferenceException){}
}

Как проверить с помощью NUnit, правильно ли обработано исключение?

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

У вас есть два варианта:

  • Использование Assert.Throws методов внутри вашего теста. Проверьте эту ссылку: https://github.com/nunit/docs/wiki/Assert.Throws
  • Украсьте свой метод тестирования атрибутом ExpectedException. Недоступно, начиная с версии 3 Nunit.

Вы должны передать значение null, поэтому просто наберите SampleMethod(null) для актовой части вашего теста.

Дополнительное примечание № 1: Для того, чтобы ваш тест перешел на зеленый цвет, вам необходимо перебросить исключение в блоке улова с помощью throw.

Примечание стороны № 2: Это действительно очень редко, чтобы поймать NullReferenceException. Вам необходимо реорганизовать свой метод и использовать защитную кодировку, как показано ниже:

public void SampleMethod(FooBarObject fooBarObject) {
    if (fooBarObject == null) {
        throw new ArgumentNullException(nameof(fooBarObject));
    }

    fooBarObject.Name = "Never forget a towel";
    fooBarObject.Number = 42;
}

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

0 голосов
/ 07 мая 2018

Наиболее идиоматический способ явной проверки отсутствия исключений - использование синтаксиса Assert.DoesNotThrow .

Как пример:

public class ClassUnderTest {
    public void SampleMethod(FooBarObject fooBarObject) {
        try { 
            fooBarObject.Name = "Never forget a towel";
            fooBarObject.Number = 42;
        }
        catch (NullReferenceException){}
    }
}

[Test]
public void Given_A_Class_Under_test_When_Calling_The_Sample_Method_It_Should_Not_Throw() {
    var sut = new ClassUnderTest();

    Assert.DoesNotThrow(() => sut.SampleMethod(null));
}

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

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

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