#unit-testing #mocking
#модульное тестирование #издевательство
Вопрос:
У меня есть следующий тест:
[Test]
public void VerifyThat_WhenHasInterceptorIsCalledWithAComponentModelThatHasTheLogAttribute_TheReturnValueIsTrue()
{
// Arrange
Mock<ComponentModel> mock = /* ... */;
LoggingInterceptorsSelector selector = new LoggingInterceptorsSelector();
// Act amp; Assert togheter
Assert.That(selector.HasInterceptors(mock.Object), Is.True);
}
Что-то не так с объединением Act amp; Assert?
Что следует сделать, чтобы устранить эту проблему, если она неверна?
Редактировать:
Как насчет такого рода тестов:
[Test]
[Category("HasInterceptors() Tests")]
public void VerifyThat_WhenHasInterceptorsIsCalledWithANullComponentModel_AnArgumentNullExceptionIsThrown()
{
LoggingModelInterceptorsSelector selector = new LoggingModelInterceptorsSelector();
Assert.That(new TestDelegate(() => selector.HasInterceptors(null)), Throws.TypeOf<ArgumentNullException>());
}
Действие и утверждение должны быть в одной строке, чтобы утверждать это правильно. По крайней мере, это то, что я понимаю из этого.
Как насчет этого:
[Test]
[Category("HasInterceptors() Tests")]
public void VerifyThat_WhenHasInterceptorsIsCalledWithANullComponentModel_AnArgumentNullExceptionIsThrown()
{
LoggingModelInterceptorsSelector selector = new LoggingModelInterceptorsSelector();
var testDelegate = new TestDelegate(() => selector.HasInterceptors(null));
Assert.That(testDelegate, Throws.TypeOf<ArgumentNullException>());
}
Соответствует ли это шаблону AAA лучше?
Ответ №1:
Я бы сделал:
[Test]
public void VerifyThat_WhenHasInterceptorIsCalledWithAComponentModelThatHasTheLogAttribute_TheReturnValueIsTrue()
{
// Arrange
Mock<ComponentModel> mock = /* ... */;
LoggingInterceptorsSelector selector = new LoggingInterceptorsSelector();
// Act
var result = selector.HasInterceptors(mock.Object);
// Assert
Assert.That(result, Is.True);
}
AAA и легко читается.
Ответ №2:
Вы не должны объединять act и assert.
Смысл шаблона в том, чтобы легко различать разные части — так что очень легко определить, где вы проводите тест, затем какой метод вызывается в act и, наконец, на чем вы настаиваете.
Смешивание act и assert приводит к путанице, не говоря уже о том, что для тех, кто привык к AAA, это застало бы их врасплох (где act?).
Обновление (после редактирования сообщения):
Большинство тестовых фреймворков позволяют вам указывать ожидаемое исключение (NUnit и MSTest используют ExpectedExceptionAttribute
) в методе тестирования (это ваше утверждение). Вы все равно должны действовать отдельно.
Комментарии:
1. но атрибут ExpectedExceptionAttribute приводит к тому, что этап утверждения теста исчезает из потока (или появляется первым, если вы рассматриваете атрибут как часть потока).
2. @the_drow — но ясность и разделение сохранены. Это диск AAA. Четкость и разделение, поэтому вы ничего не теряете. И люди привыкли к исключениям, которые тестируются таким образом.
3. @the_drow — Мне больше нравится третий подход. Неплохой способ сделать это, хотя синтаксис может немного затемнить смысл.