4

アサートとアクトのステップを組み合わせても大丈夫ですか?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回呼び出します。呼び出しのたびに、ダイアログが実際にキャンセルされていないことを確認したいと思います。次に、3回目の呼び出しで、ダイアログをキャンセルする必要があります。

これはAAA構文/スタイリングの「合法的な」使用ですか?

4

2 に答える 2

8

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);
}
于 2011-05-07T20:19:10.793 に答える
1

AAA は、単体テストを読みやすくするための単なるガイドラインです。正当な理由があれば、逸脱してもまったく問題ありません。空白とコメントを使用して、コード内のさまざまなフェーズをある程度分離しました。これは良いことです。このような場合、テストしているストーリーを説明するコメントを追加することも役立つ場合があります。

于 2010-09-22T15:14:12.743 に答える