2012-12-07 7 views
9

Obecnie mamy ten krok:specflow: - "Niejednoznaczne definicje step Znaleziono kroku", gdy 1 krok ma więcej params niż inne

[When(@"I set the scenario price for product (.*) to (.*)")] 
public void WhenISetTheScenarioPriceForProductPToN(string product, string priceStr) 

Pragnę dodać kroku:

[When(@"I set the scenario price for product (.*) to (.*) in the (.*) zone") 
public void WhenISetTheScenarioPriceInZoneForProductPToN(string product, string priceStr, string zone) 

Jednak specyfikacja przepływu daje błąd "Niejednoznaczne definicje kroków dla kroku" między dwoma krokami.

mam zmęczony:

[When(@"I set the scenario price for product (.*) to (.*) in the (.*) zone")] 
    [When(@"I set the scenario price for product (.*) to (.*)")] 
    public void WhenISetTheScenarioPriceInZoneForProductPToN(string product, string priceStr, string zone) 

ale nie z „wiążącej błąd: parametr licznik niedopasowanie” Miałem nadzieję, że dla drugiej "kiedy" minie zero.

+0

Nie mogę odtworzyć problemu z niejednoznacznymi krokami z podobnymi krokami w teście, ale niedopasowanie liczby parametrów jest spowodowane tym, że każdy kod wzoru regex generuje parametr dla metody. Wygląda na to, że nie obsługuje on również domyślnych wartości parametrów. –

+0

@Admin, który zaczyna brzmieć jak błąd w przepływie, ponieważ nie rozumiem, dlaczego "kiedy" i "dany" shuold dopasowują się w inny sposób. –

Odpowiedz

11

Problem jest na drugim miejscu (. *). To można rozwinąć, aby dopasować "xyz w strefie abc". Czy zamiast tego możesz dopasować tylko jedno słowo? tj. (\ w +)

[When(@"I set the scenario price for product (.*) to (\w+)")] 

To zapobiegnie również krótszemu dopasowaniu Regex w strefie abc.

Możesz to przetestować, dodając dłuższe komentarze Kiedy atrybut i metoda oraz debugowanie sprawdzają, co pasuje do krótszego.

Ponadto, zawsze musisz mieć taką samą liczbę Regeksów jako parametrów, dlatego kombinacja nie działa.


To nie działa dla mnie, jest to spowodowane ceną "0,99" i "." nie jest dopasowany przez \ w. Działa to jednak:

[When(@"I set the scenario price for product (.*) to (\S+)")] 
public void WhenISetTheScenarioPriceForProductPToN(string product, string priceStr) 

ponieważ nasze "wartości testowe" nie zawierają spacji.

+0

Jeśli używasz liczb, to rozważ (\ d + (\. \ D +)?), Który pasuje do miejsc dziesiętnych i bez nich – AlSki

3

początkowo wierzył, to dlatego, że regex pod koniec pierwszej definicji kroku:

[When(@"I set the scenario price for product (.*) to (.*)")] 

byłoby uchwycić (lub odpowiednika) ten sam ciąg znaków, który pójdzie do swojej kolejnej definicji.

Jednak jest to, że i fakt, że dwuetapowe metody implementacji zawierają niejednoznaczne typy argumentów. Nie mogłem tego odtworzyć na początku, ponieważ użyłem int (jak na mój komentarz), ale używając string możesz odtworzyć ten problem jako string jest niejednoznaczny. Dowolny parametr podany jako argument w pliku definicji kroku może być traktowany jako string.

Zmień swoje metody krok do następujących:

public void WhenISetTheScenarioPriceInZoneForProductPToN(string product, double price, string zone) 

public void WhenISetTheScenarioPriceForProductPToN(string product, double price) 

Teraz chociaż regex nie uległa zmianie i tak teoretycznie nadal chciwie mecz, SpecFlow oferuje konwersję do prymitywnych typów (i innych typów poprzez zlecenie konwersji) tak ignoruje pozostałą część zdania. Oznacza to, że nie jest niejednoznaczny, ponieważ wykrywa końcowy parametr string po double (w przeciwieństwie do tego, że nie jest w stanie zdecydować, czy część zdania pasuje do argumentu lub ma więcej wbudowanych argumentów).

Powiązane problemy