Как вы указываете, что тест NUnit не должен пройти? - PullRequest
3 голосов
/ 21 декабря 2010

Есть ли способ указать, что вы хотите, чтобы тест NUnit завершился неудачей, а это означает, что сбой должен сообщаться как прохождение, а про прохождение должно сообщаться как сбой?Это было бы полезно при тестировании ваших собственных расширений NUnit.Вот пример того, что я хотел бы сделать:

[Test]
[ExpectFail]
public void TypeOf_fail() {
    string str = "abc";
    str.Should().Be.TypeOf<int>();
}

Это не компилируется, потому что [ExpectFail] является воображаемым атрибутом, иллюстрирующим то, что я хочу сделать, но код внутри методаработает отлично.Эта проблема специфична для тестирования расширения NUnit в том смысле, что вы обычно можете просто написать свои тесты для прохождения, а не для неудачи.В этом случае вам нужно доказать, что можно написать неудачный тест, используя тестируемое расширение NUnit.

Ответы [ 4 ]

2 голосов
/ 06 октября 2014

Я знаю, что это старый пост, но вот что мне помогло, используя NUnit:

[TestCase("SomeValidValue")]
[TestCase("{3X5XFX9X-7XCX-4XCX-8X3X-3XAXEX9X0XBX}", ExpectedException = typeof(AssertionException))]
public void GetSpecificConfiguration(string key)
{
    Assert.IsNotNull(Config.Instance.GetRecord(key));
}

Этот подход позволяет мне пройти один и тот же тест с двумя ожиданиями: одно успешное и одно неудачное.

2 голосов
/ 31 июля 2011

А как насчет Assert.Throws (x.DoSomething ());

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

Учитывая, что в этом случае вы хотите протестировать расширения NUnit, которые, как я предполагаю, функционируют путем выполнения вызовов Assert, вы можете выполнить Assert.Throws (...), а затем выполнить описанное выше.

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

2 голосов
/ 22 декабря 2010

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

(ссылка: «Искусство модульного тестирования» Роя Ошерова)

Почему тесты, предназначенные для провала, плохо? Они могут потерпеть неудачу неожиданным образом, и все же быть помечены как проход, потому что они потерпели неудачу. В вашем примере, предполагая, что Should() является тестируемым методом (хотя эта точка остается, даже если это не так), вы пишете тест выше и помечаете его как «ожидаемый сбой». Это не удается. Все отлично. Через пару месяцев вы вернетесь к Should() и поймете, что он нуждается в некотором рефакторинге, поэтому вы изменили его реализацию.

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

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

[Test]
public void TypeOf_ShouldBeString() {
    string str = "abc";
    str.Should().Be.TypeOf<string>();
}

или

[Test]
public void TypeOf_ShouldNotBeInt() {
    string str = "abc";
    str.Should().Not.Be.TypeOf<int>();
}

(Не уверен в синтаксисе, который вы используете, поэтому. Вероятно, не потребуется замена на правильный синтаксис, но настроение сохраняется).

Edit2: Если то, что вы пытаетесь сделать, это убедиться, что ваш метод Should () завершился неудачно (с помощью метода Assert.), То вам нужно перехватить исключение NUnit AssertionException, которое выполняет Assert. статические методы бросают. Попробуйте это:

[Test]
[ExpectedException(typeof(AssertionException))]
public void ShouldBeTypeOf_WithInt_Fails() {
    string str = "abc";
    str.Should().Be.TypeOf<int>();
}    
0 голосов
/ 23 августа 2014

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

[Test]
[ExpectedException(typeof(Exception))]
public void TypeOf_fail() {
    string str = "abc";
    str.Should().Be.TypeOf<int>();
}

Конечно, замените Исключение на самое конкретное возможное исключение.

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