Во-первых, это очень похоже на этот вопрос .
Я пытаюсь выполнить тест, который проходит, если программа не сгенерировать конкретное исключение, но если программа делает это конкретное исключение, я хочу, чтобы 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 (где одно исправление раскрывает старую уязвимость в коде, а это исправление - другую уязвимость, и это исправление снова выставляет первую ошибку;повторяю) считай себя счастливчиком.
Я увидел, как мне показалось, метод ловушки для определенного нежелательного состояния: если оно когда-нибудь вернется, мы можем быстро сообщить нарушающей стороне, почему их исправление нарушило код.