2012-04-23 24 views
6

Jak najlepiej sobie radzić z tym, że wiele z moich kroków powinno przyjmować 0, 1, a nawet 2 daty jako "pierwsze parametry"? Na przykład, w jaki sposób najlepiej dokonać wsparcie dla opcjonalnych argumentów SpecflowParametry opcjonalne z Specflow

Najprostszym przypadkiem jest gdy terminy nie dotyczą, o ile kroki zdarzyć po każdym innym

Given Peter was born 23-06-1973 
And Peter created an account 
And Peter deposited $200 

Często jednak wiele kroków które są zależne od czasu, jak

Given Peter was born 23-06-1973 
And at 1-4-2012 Peter created an account 
And at 13-4-2012 Peter deposited $200 

w innych czasach istnieją dwa terminy, takie jak data w czasie rzeczywistym oraz datę, kiedy coś się stało. Na przykład. Peter wypełnił drukowany formularz 14-4-2012 za przelew pieniężny, ale formularz zaginął na kilka dni i musimy dziś odnotować, że formularz został wypełniony kilka dni temu.

Given Peter was born 23-06-1973 
... 
And at 16-4-2012 really at 14-4-2012 Completed a transfer form to transfer $100 to account 12345 

Odpowiedz

3

Preferuję prostotę wielu kroków, ale jeśli chcesz robić to, co proponujesz, musisz stworzyć odpowiednie wyrażenie regularne. Coś podobnego (nie testowane):

[Given(@"(at ([0-9-]+) (really at ([0-9-]+) |)|)(\w+) Completed a transfer form to transfer \$(\d+) to account (\d+)"] 
public void TransferStep(string dummy1, DateTime? atDate, string dummy2, DateTime? reallyAtDate, string name, decimal amount, int account) 
4

dwie rzeczy pojawia się w mojej głowie:

Po pierwsze ja teraz dni nie martwić się dużo mający mnóstwo definicji kroku tak długo jak są one krótkie (oneliners) i dzwoni do jakiejś warstwa automatyzacji lub DSL, która pomaga mi zautomatyzować testowany system. Zobacz tę inspirację jako excellent presentation.

W tym sensie można po prostu podwoić definicje kroków z "przeciążeniami" dla każdego przypadku.

Pierwszym krokiem w drugim rozwiązaniu było ułożenie atrybutów nad sobą za pomocą tej samej metody. To działa, ale nie dla parametrów opcjonalnych. (I opcjonalne parametry nie działają dobrze z typami odniesienia jak DateTime, ale działa funkcja DateTime? Nullable). Jeśli wykonasz takie kroki, otrzymasz komunikat o błędzie:

Niedopasowanie liczby parametrów! Sposób wiązania 'Class1.MyGiven (Int32, Int32, Int32)' powinna mieć 1 parametry

więc spaść z powrotem do mojego pierwszego rozwiązania tak:

[Given(@"case one with one int '(\d+)'")] 
    public void Case1(int a) 
    { 
     // Short but sweet step definition that calls into automation layer 
    } 

    [Given(@"case one with two ints '(\d+)' and '(\d+)'")] 
    public void Case2(int a, int b) 
    { 
     // Short but sweet step definition that calls into automation layer 
    } 

    [Given(@"case one with three ints '(\d+)' and '(\d+)' and also '(\d+)'")] 
    public void Case3(int a, int b , int c) 
    { 
     // Short but sweet step definition that calls into automation layer 
    } 

Mam nadzieję, że nie spowoduje za dużo zamieszania, przechodząc tam iz powrotem. Przepraszam - nie miałem przygotowanego IDE w autobusie :)

+0

Miałem nadzieję na coś, gdzie ewentualne terminy zostały refactored się ponieważ będzie ona miała zastosowanie do większości zasad ... –

+0

nie zastosował się tam ... Co masz na myśli „refactored out”? –

+0

Powiedzmy, że masz 100 kroków, z twoim podejściem potrzebuję zdefiniować 300 kroków. Miałem nadzieję, że część kroków może zostać relegowana do jakiegoś argumentu-parsera –

0

Ten pracował dobrze dla mnie, przeciążania funkcji, które wymagają opcjonalnych parametrów i przechodzącą w domyślnych.

Byłoby wspaniale, gdyby opcjonalne obsługiwane opcjonalne parametry np. string searchTerm = "" ale to nie jest w tej chwili.

[When(@"I request a list of managers")] 
public void WhenIRequestAListOfManagers() 
{ 
    WhenIRequestAListOfManagers(""); 
} 

[When(@"I request a list of managers with the search term (.*)")] 
public void WhenIRequestAListOfManagers(string searchTerm) 
{ 
    //do stuff 
} 
Powiązane problemy