2012-04-26 4 views
2

Вот что яКак бы я правильно настроил эту особенность/сценарий SpecFlow?

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 

Проблема заключается в том, что я повторив Когда два раза, но я не вижу способ обойти это, что мне нужно сделать, это выяснить, как вы бы установить это правильно с 2 сценариями или я не смотрю на это правильно?

Вот определения Step, но они мне кажутся не такими, потому что я должен иметь все это в одном классе Steps для его запуска. По-моему, я читаю неправильно. Когда я нарушу эти 2 части и положить их в своем собственном шаге классе я получаю Erorr:

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 = "[email protected]"; 
     } 

     [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 = "[email protected]"; 
     } 

     [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."); 
     } 
    } 

ответ

3

У вас есть различные контексты в этих сценариях. Когда такое же событие происходит в разных контекстах, у вас разные результаты. То, что вы описываете по этим сценариям.

Таким образом, нет проблем с повторением шага When. Вы делаете то же самое дважды. Просто используйте его повторно. Если в некоторых сценариях вы будете иметь одинаковые контексты, но разные события, то вы будете повторять шаги 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. Вы должны написать один и тот же код для настройки сцены для каждого сценария. Итак, у вас есть только одна реализация этого шага, которая повторно используется обоими сценариями.

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

Также вы можете использовать одно определение шага, чтобы проверить свои результаты (потому что они на самом деле же - проверка общего балла):

[Then(@"my total score should be (\d+)")] 
public void ThenMyTotalScoreShouldBe(int score) 
{ 
    Assert.AreEqual(score, _game.Score); 
} 
+0

Хорошо, поэтому для моего случая я действительно должен иметь один. Предоставлено «Учитывая, что я заполняю свое регистрационное имя и адрес электронной почты» и 2 И утверждения «И информация действительна», «И информация недействительна», «Когда я нажимаю Отправить ", а затем 2 Затем утверждения правильные? Кроме того, все это внутри одного класса Step? –

+0

На самом деле у вас может быть один заданный шаг «Учитывая, что я заполняю регистрационную форму» с таблицей счетчика, которая описывает входные данные. Но я предпочел бы пойти с двумя разными шагами (как у вас сейчас), которые описывают, какие данные были введены (действительны или недействительны). После подготовки контекста у вас есть один «Когда я отправляю регистрационную форму» (я думаю, что он ближе к делу, а затем «Когда я нажимаю« Отправить »). И еще два шага, как у вас сейчас. –

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| 

Если у вас есть точно такой же шаг в два отдельных шаге классов, вам необходимо определить [Scope], в противном случае вы получите неоднозначную ошибку.

+0

где идет Когда? –

+0

The Then и Then остаются такими же, как в вашем вопросе. –

Смежные вопросы