Соответствует ли это шаблону AAA?

#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 — Мне больше нравится третий подход. Неплохой способ сделать это, хотя синтаксис может немного затемнить смысл.