2012-12-07 9 views
9

Attualmente abbiamo questo passaggio:specflow: - "definizioni step ambigui trovati per step", quando uno step ha più params rispetto agli altri

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

desidero aggiungere il passo:

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

Tuttavia, il flusso delle specifiche fornisce un errore "Definizioni passo ambiguo trovato per passaggio" tra i due passaggi.

Ho stanco:

[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) 

ma che non riesce con un "legame di errore:! Parametro di conteggio non corrispondente" Speravo che sarebbe passato nulla per il 2 ° "quando".

+0

Non riesco a riprodurre il problema ambiguo del passaggio con passaggi simili nel test, ma la mancata corrispondenza del conteggio dei parametri è dovuta al fatto che ciascun codice del modello di regex genera un parametro per il metodo. Non sembra supportare neanche i valori dei parametri predefiniti. –

+0

@Admin, inizia a sembrare un bug in specflow perché non vedo perché "when" e "given" shuold corrispondano in un modo diverso. –

risposta

11

Il problema è il secondo (. *). Questo può espandersi per abbinare "xyz nella zona abc". Puoi invece abbinare una sola parola? vale a dire (\ w +)

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

Che sarebbe poi evitare che l'abbinamento Regex più corta nella zona abc pure.

È possibile testare questo commentando più lungo Quando attributo e metodo e debug per vedere ciò che corrisponde a quello più breve.

Inoltre, è sempre necessario avere lo stesso numero di Regex come parametri, motivo per cui quello combinato non funziona.


Questo non ha funzionato per me, questo è dovuto al prezzo "0.99" e "." non corrispondente a \ w. Tuttavia questo funziona:

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

come i nostri "valori di test" non hanno spazi in loro.

+0

Se si utilizzano i numeri, prendere in considerazione (\ d + (\. \ D +)?) Che corrisponde con e senza posizioni decimali – AlSki

3

inizialmente ho creduto che questo è perché l'espressione regolare alla fine della prima definizione passo:

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

Sarebbe catturare (o della partita) la stessa stringa che entra nella tua successiva definizione.

Tuttavia, è il e il fatto che i metodi di implementazione in due passaggi contengono tipi di argomenti ambigui. Non è stato possibile riprodurre questo inizialmente perché ho utilizzato int (come per il mio commento), ma utilizzando string è possibile riprodurre questo problema come string è ambiguo. Qualsiasi parametro fornito come argomento in un file di definizione step può essere considerato come string.

Cambia i tuoi metodi passo al seguente:

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

public void WhenISetTheScenarioPriceForProductPToN(string product, double price) 

Ora, anche se l'espressione regolare non è cambiato e quindi in teoria sarà ancora avidamente corrispondere, SpecFlow offre la conversione di tipi primitivi (e altri tipi tramite conversione personalizzata) in modo ignora il resto della frase. Ciò significa che non è ambiguo perché rileva il parametro finale string dopo il double (anziché non essere in grado di decidere se una parte della frase corrisponde a un argomento stringa o ha più argomenti incorporati).