2010-09-22 2 views
3

Можно ли смешивать шаги Assert and Act? Является ли AAA более ориентированным, чем правило? Или я чего-то не хватает?Подтверждение смешивания и действие в синтаксисе модульного тестирования AAA

Вот мой тест:

[TestMethod] 
public void CancelButtonSelected_DontCancelTwiceThenCancel_DialogCloses() 
{ 
    // Arrange 
    IAddAddressForm form = Substitute.For<IAddAddressForm>(); 
    // Indicate that when Show CancelMessage is called it 
    // should return cancel twice (saying we want to cancel the cancel) 
    // then it should return ok 
    form.ShowCancelMessage().Returns(DialogResult.Cancel, 
     DialogResult.Cancel, DialogResult.OK); 

    AddAddressController controller = new AddAddressController(form); 
    AddressItem item = TestHelper.CreateAddressBob(); 

    // Act 
    EnterAddressInfo(form, controller, item); 
    controller.CancelButtonSelected(); 
    Assert.IsTrue(form.DialogResult == DialogResult.None); 

    controller.CancelButtonSelected(); 
    Assert.IsTrue(form.DialogResult == DialogResult.None); 

    controller.CancelButtonSelected(); 

    // Assert 
    Assert.IsTrue(form.DialogResult == DialogResult.Cancel); 
} 

Так я называю это метод 3 раза. После каждого вызова я хочу убедиться, что мы действительно не отменили диалог. Затем на третьем вызове диалог должен быть отменен.

Является ли это «законным» использованием синтаксиса/стиля AAA?

ответ

1

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

7

AAA - это руководство, чтобы сделать ваши юнит-тесты более удобочитаемыми. В приведенном примере я бы сказал, что вы не достигли этой цели.

Я думаю, что следующие тесты делают сценарий, который вы тестируете, более читабельны.

[TestMethod] 
public void CancelButtonSelected_ShouldSetDialogResultToNone_WhenFirstCancelButtonIsSelected() 
{ 
    // Arrange 
    IAddAddressForm form = ArrangeFormForCancelButtonSelectedTests(); 
    AddAddressController controller = ArrangeControllerForCancelButtonSelectedTests(); 

    // Act 
    controller.CancelButtonSelected(); 

    // Assert 
    Assert.IsTrue(form.DialogResult == DialogResult.None); 
} 

[TestMethod] 
public void CancelButtonSelected_ShouldSetDialogResultToNone_WhenSecondCancelButtonIsSelected() 
{ 
    // Arrange 
    IAddAddressForm form = ArrangeFormForCancelButtonSelectedTests(); 
    AddAddressController controller = ArrangeControllerForCancelButtonSelectedTests(); 

    // Act 
    controller.CancelButtonSelected(); 
    controller.CancelButtonSelected(); 

    // Assert 
    Assert.IsTrue(form.DialogResult == DialogResult.None); 

} 

[TestMethod] 
public void CancelButtonSelected_ShouldSetDialogResultToCancel_WhenThirdCancelButtonIsSelected() 
{ 
    // Arrange 
    IAddAddressForm form = ArrangeFormForCancelButtonSelectedTests(); 
    AddAddressController controller = ArrangeControllerForCancelButtonSelectedTests(); 

    // Act 
    controller.CancelButtonSelected(); 
    controller.CancelButtonSelected(); 
    controller.CancelButtonSelected(); 

    // Assert 
    Assert.IsTrue(form.DialogResult == DialogResult.Cancel); 
} 
+0

+1 для косвенного указания, что тест должен иметь только одну причину. –