Проверьте, что в NUnit не произошло конкретного исключения - PullRequest
0 голосов
/ 30 июня 2019

Во-первых, это очень похоже на этот вопрос .

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

Вот ситуация, Я делаю ката , и я подумал, что должно произойти, если кто-то введет значение для 22-го броска (наибольшее количество бросков должно быть 21, если в последнем кадре будет запасной).

Мое решение использует массив из 21 дюйма, и я создал тест, который вводит 22 дюйма.

Когда я смотрю на эту страницу , я вижу вариант дляэтот синтаксис:

Assert.DoesNotThrow( TestDelegate code, string message );

Вот как я думаю, строка должна выглядеть, но я знаю (и компилятор жалуется), что использование typeof не даст мне код тестового делегата.

[Test]
public void ShouldIgnore22ndRoll()
{
     Assert.DoesNotThrow(typeof(System.IndexOutOfRangeException), "There should never be more than 21 rolls in a game");
     RollAllTheSameNumber(1, 22);
}

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

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

Как бы я написалthis assert?

Edit:

Вот определения переменных:

int rollNumberDuringDataInput = 0;
const int AllowableNumberOfRolls = 21;

Вот фиксированный код (беззвучно игнорируя любые броски после числа 21):

public void AddPins(int pins)
{
    if (rollNumberDuringDataInput < AllowableNumberOfRolls)
    {
        rolls[rollNumberDuringDataInput++] = pins;
    }
}

Вот код, который приведет к сбою теста, разрешив более 21 броска:

public void AddPins(int pins)
{
    rolls[rollNumberDuringDataInput++] = pins;
}

В настоящее время это сообщение, сгенерированное в средстве выполнения теста: Сообщение: система.IndexOutOfRangeException: индекс находился за пределами массива.

То, что я хочу, чтобы сообщение было для этого исключения (и только для этого исключения Message: System.IndexOutOfRangeException: никогда не должно быть большечем 21 бросок в игре.

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

Если вы никогда не имели дело с чем-тосерия ошибок k-a-mole (где одно исправление раскрывает старую уязвимость в коде, а это исправление - другую уязвимость, и это исправление снова выставляет первую ошибку;повторяю) считай себя счастливчиком.

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

1 Ответ

0 голосов
/ 30 июня 2019

Из вашего описания

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

[Test]
public void ShouldIgnore22ndRoll() {    

     Assert.Throws<System.IndexOutOfRangeException>(() => RollAllTheSameNumber(1, 22), "More than 21 rolls in a game should fail.");

}

Любое другое исключение, кроме ожидаемого, будет означать, чтокод не работает должным образом.

...