2

これが私が持っているものです

Feature: Register a new customer
    As a user
    I need to be able to register myself
    so that I can place orders

Scenario: Register a new customer with Valid information
    Given I fill in valid customer information
    When I press submit
    Then I should be notified that I'm registered

Scenario: Register a new customer with Invalid information
    Given I fill in invalid customer information
    When I press submit
    Then I should be notified it was invalid

問題は、Whenを2回繰り返していることですが、これを回避する方法がわかりません。2つのシナリオでこれを正しく設定する方法を理解する必要がありますか、それとも正しく見ていませんか?

ステップの定義は次のとおりですが、実行するにはこれらすべてを同じステップクラスに含める必要があるため、私には正しくないようです。私の意見では正しく読まない。これら2つを分解して、独自のステップクラスに入れると、次のようなエラーが発生します。

binding error: Ambiguous step definitions found for step 'When I press submit':



[Binding]
   public class RegisterAValidCustomerSteps
   {
      private RegisterCustomerViewModel _registerCustomerVm;

      [Given(@"I fill in valid customer information")]
      public void GivenIFillInValidCustomerInformation()
      {
         // use the ViewModel to represent the User interacting with the View
         _registerCustomerVm = new RegisterCustomerViewModel();
         _registerCustomerVm.FirstName = "Mark";
         _registerCustomerVm.LastName = "W";
         _registerCustomerVm.Email = "mark@whatever.com";
      }

      [Given(@"I fill in invalid customer information")]
      public void GivenIFillInInvalidCustomerInformation()
      {
         // simulate possible invalid name by missing the Last Name
         _registerCustomerVm = new RegisterCustomerViewModel();
         _registerCustomerVm.FirstName = "Mark";
         _registerCustomerVm.Email = "markl@whatever.com";
      }

      [When(@"I press submit")]
      public void WhenIPressSubmit()
      {
         _registerCustomerVm.Submit();
      }

      [Then(@"I should be notified that I'm registered")]
      public void ThenIShouldBeAbleToPlaceOrders()
      {
         _registerCustomerVm.MessageText.ShouldBe("Success!  Check your inbox for confirmation");
      }

      [Then(@"I should be notified it was invalid")]
      public void ThenIShouldBeNotifiedItWasInvalid()
      {
         _registerCustomerVm.MessageText.ShouldBe("Failure!  Last Name can't be blank.");
      }
   }
4

2 に答える 2

3

これらのシナリオでは、さまざまなコンテキストがあります。同じイベントが異なるコンテキストで発生すると、結果も異なります。それが、これらのシナリオで説明していることです。

Whenしたがって、ステップを繰り返しても問題はありません。あなたは実際に同じことを2回行います。再利用するだけです。一部のシナリオでは、コンテキストは同じでイベントが異なる場合は、Given手順を繰り返す必要があります。結果も同じです。

ボウリングゲームの次のシナリオを検討してください。

Scenario: Gutter game
    Given a new bowling game
    When all balls landing in gutter
    Then total score should be 0

Scenario: All strikes
    Given a new bowling game
    When all rolls are strikes
    Then total score should be 300

これらのシナリオには同じコンテキストがありますGiven a new bowling game。各シナリオのセットアップシーンに同じコードを記述する必要があります。したがって、このステップの実装は1つだけであり、両方のシナリオで再利用されます。

[Given(@"a new bowling game")]
public void GivenANewBowlingGame()
{
    _game = new Game();
}

また、1つのステップの定義を使用して、結果を検証できます(実際には同じであるため、合計スコアを検証します)。

[Then(@"my total score should be (\d+)")]
public void ThenMyTotalScoreShouldBe(int score)
{
    Assert.AreEqual(score, _game.Score);
}
于 2012-04-26T21:38:39.107 に答える
1

2つのシナリオをテストしていますが、これは有効な方法です。同様のことを行うもう1つの方法がありますが:

Scenario 1: valid
Given I enter the following data:
|Field 1| Field 2|
|Valid| Valid|

Scenario 1: invalid
Given I enter the following data:
|Field 1| Field 2|
|Valid| Invalid|

2つの別々のステップクラスにまったく同じステップがある場合は、を定義する必要があります[Scope]。そうしないと、あいまいなエラーが発生します。

于 2012-04-26T21:42:04.910 に答える