1

開発プロセスで Give-When-Then として実装している Arrange/Act/Assert に関する説明を探しています。私はコンセプトに固執しようとしていますが、特定のイベント (特にユーザー入力) の間、単体テストで適切にキャプチャするために、「Act」アクションを「Arrange」アクションとして再検討する必要があることがわかりました。 . ここでは、モッキング フレームワークとしてMoqを使用しています。

例: 私のプロジェクトでは、コードの焦点はユーザーが提供する画像です。ユーザーが画像を選択できる機能がありますが、画像が既に存在する場合は、アクティブな画像を置き換えるか、アクションをキャンセルしてアクティブな画像を保持するかをユーザーに問い合わせます。この特定のシナリオを記述する適切な方法は次のようになると思います。

画像が既に存在するワークスペースが与えられた
場合ユーザーが新しい画像を要求し
ユーザーがアクティブな画像を置き換えることを選択した場合
プログラムは画像を置き換える必要があります

テスト的には、次のようになります。

mockModel.SetupProperty(m => m.Image, new Bitmap(100, 100));  // Given
mockView.Raise(v => v.UserRequestsNewImage += null);          // When
mockMBox.Setup(mb => mb.ViewResult).Returns(ViewResult.OK);   // And
mockView.Verify(v => v.OpenAddImageFileDialog(), Times.Once); // Then

コード的には、私のプレゼンターでは、次のようになります。

private void view_UserRequestsNewImage()
{
  if (model.Image != null)
  {
    mbox.ShowDialog();

    if (mbox.ViewResult == ViewResult.Cancel)
      return;
  }

  view.OpenAddImageFileDialog();
}

Setupただし、ビューRaiseが呼び出された後にメッセージ ボックスが発生するため、これは失敗します。Setupそのため、その前にを移動する必要があります (そして、 を使用Setupすると、「アレンジ」セットアップのように感じられます):

画像が既に存在するワークスペースが与えられ
ユーザーがアクティブな画像を置き換えることを選択した
場合ユーザーが新しい画像を要求した場合プログラムは画像を置き換える必要があり
ます

しかし今、私のシナリオは順不同で、正しく流れていないように感じます。画像を置き換えるというユーザーの選択 ( ) は、ユーザーが新しい画像を追加するという選択 ( ) のSetupに発生するため、Act ステップの一部であるべきだと思いますが、適切にモックするためには、アレンジステップに入れます。Raise

ここで間違ったモッキングフレームワークを使用していますか? これを行うより良い方法はありますか?または、Given-When-Then セットアップでユーザー入力ステップをどこに配置するかについて非現実的に心配していますか?

前もって感謝します。

4

1 に答える 1

1

「ユーザーが新しい画像を要求したとき」、ユーザー現在の画像を置き換えることを選択する必要があります。

したがって、「Given, When, Then」を次のように書き直すことができます。

  • 画像が既に存在するワークスペースが与えられた場合
  • ユーザーがアクティブな画像を置き換えることを選択したとき
  • 次に、プログラムは画像を置き換える必要があります

つまり、「ユーザーが新しい画像を要求する」ことを示す「いつ」を省略します。これは、現在の画像を置き換えるときにとにかくこれを行う必要があるためです。

また、コメントを捨てて (コードのにおいがしますが、それほど多くはありません!)、これらのテスト ステップを次のように小さなメソッドに入れます。

void GivenImageAlreadyPresent()
{
 mockModel.SetupProperty(m => m.Image, new Bitmap(100, 100));  
}

void WhenActiveImageReplaced()
{
 mockMBox.Setup(mb => mb.ViewResult).Returns(ViewResult.OK);   
 mockView.Raise(v => v.UserRequestsNewImage += null);          
}

void ThenImageShouldBeReplaced()
{
 mockView.Verify(v => v.OpenAddImageFileDialog(), Times.Once);
}

void Test()
{
 GivenImageAlreadyPresent();
 WhenActiveImageReplaced();
 ThenImageShouldBeReplaced();
}

これにより、実際のテストが読みやすくなり (つまり、自己文書化)、必要に応じて手順を再利用できるようになります。

于 2013-10-04T21:47:15.977 に答える