Смешение Assert и Act в модульном тестировании AAA - PullRequest
4 голосов
/ 22 сентября 2010

Можно ли смешивать шаги Assert и Act? Является ли 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?

Ответы [ 2 ]

8 голосов
/ 08 мая 2011

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);
}
1 голос
/ 22 сентября 2010

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

...