SpecFlow: Przekazywanie parametrów

W poprzednim wpisie, pokazałem jak stworzyć prosty zestaw testów za pomocą SpecFlow. Dzisiaj chciałbym bardziej przyjrzeć się parametrom, które można przekazywać. Rozważmy następujący scenariusz:

Scenario: Add two numbers
    Given I have entered 50 into the calculator
    And I have entered 70 into the calculator
    When I press add
    Then the result should be 120 on the screen

Liczby 50, 70 i 120 to parametry wejściowe. Jeśli mamy te same zachowania albo bardzo podobne, wtedy lepiej korzystać z argumentów, a nie duplikować wszędzie opis. Dla przypomnienia, wygenerowane metody będą wyglądać następująco:

[Given(@"I have entered (.*) into the calculator")]
public void GivenIHaveEnteredIntoTheCalculator(int p0)
{
  ScenarioContext.Current.Pending();
}
[Then(@"the result should be (.*) on the screen")]
public void ThenTheResultShouldBeOnTheScreen(int p0)
{
  ScenarioContext.Current.Pending();
}

Pozostaje pytanie, jak SpecFlow wie, że argument p0 to tak naprawdę liczba z tekstu? Jeśli spojrzymy na opis scenariusza, to jest to zwykły tekst – nie ma tam żadnego modyfikatora mówiącego o tym, że dana liczba to parametr a nie tekst. Tak naprawdę, wspomniane atrybuty to wyrażenia regularne:

[Given(@"I have entered (.*) into the calculator")]

Wszystko w nawiasach (.*) to dany parametr wejściowy. W powyższym przykładzie istnieje jeden parametr ponieważ mamy jedną grupę (.*).

Inny REGEX może wyglądać następująco:

[Given(@"I have entered (50|60) into the calculator")]

Powyższe wyrażenie zaakceptuje wyłącznie liczby 50 lub 60. Dla innych parametrów zostanie wyrzucony wyjątek:

No matching step definition found for one or more steps.

using System;

using TechTalk.SpecFlow;

Leave a Reply

Your email address will not be published.