Модульные испытания должны быть разработаны таким образом, чтобы:
Они создали какое-то государство
Они запускают тестируемый метод
Они утверждают, что одна вещь верна после завершения тестируемого метода
(ссылка: «Искусство модульного тестирования» Роя Ошерова)
Почему тесты, предназначенные для провала, плохо? Они могут потерпеть неудачу неожиданным образом, и все же быть помечены как проход, потому что они потерпели неудачу. В вашем примере, предполагая, что 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>();
}