2013-12-12 15 views
5

Ecco il mio cetriolino:Specflow Scenario Outline non la generazione di codice passo previsto

Scenario Outline: Login using valid email address 
Given I have not logged into the current computer 
And Username <username> and password <password> is a valid account 
When I start the client 
And Login using username <username> and password <password> 
Then The client should navigate to first time screen 

Examples: 
| username   | password | 
| [email protected] | password001 | 
| valid002   | password002 | 

Ciò genera il file seguente passo:

[Binding] 
public class UserLoginSteps 
{ 
    [Given(@"I have not logged into the current computer")] 
    public void GivenIHaveNotLoggedIntoTheCurrentComputer() 
    { 
     ScenarioContext.Current.Pending(); 
    } 

    [Given(@"Username valid(.*)@xyz\.com and password password(.*) is a valid account")] 
    public void GivenUsernameValidXyz_ComAndPasswordPasswordIsAValidAccount(int p0, int p1) 
    { 
     ScenarioContext.Current.Pending(); 
    } 

    [When(@"I start the client")] 
    public void WhenIStartTheClient() 
    { 
     ScenarioContext.Current.Pending(); 
    } 

    [When(@"Login using username valid(.*)@xyz\.com and password password(.*)")] 
    public void WhenLoginUsingUsernameValidXyz_ComAndPasswordPassword(int p0, int p1) 
    { 
     ScenarioContext.Current.Pending(); 
    } 

    [Then(@"The client should navigate to first time screen")] 
    public void ThenTheClientShouldNavigateToFirstTimeScreen() 
    { 
     ScenarioContext.Current.Pending(); 
    } 
} 

I problemi sono i seguenti:

  • generata regex per username si basa sulla prima voce nella colonna degli esempi. Questo non è quello che voglio in quanto non tutti gli esempi seguono questo schema.
  • I nomi dei metodi utilizzano la prima voce nella colonna degli esempi (ad esempio WhenLoginUsingUsernameValidXyz_ComAndPasswordPassword). È difficile da leggere e se i dati nella tabella degli esempi cambiano il nome del metodo non è più corretto
  • Il tipo per i parametri è int. Dovrebbero essere una stringa.

mi aspetterei la generazione definizione passo a qualcosa di output come questo:

[When(@"Login using username (.*) and password (.*)")] 
    public void WhenLoginUsingUsernameAndPassword(string p0, string p1) 
    { 
     ScenarioContext.Current.Pending(); 
    } 

Mi sto perdendo qualcosa? C'è un modo per influenzare il modo in cui SpecFlow genera i metodi passo per i contorni degli scenari? In caso contrario, qual è il modo migliore per risolvere questo problema senza che il codice generato funzioni dietro a clobbering le mie modifiche

risposta

4

In breve, buone notizie. Questi binding auto-generati sono solo una comodità e non vengono automaticamente rigenerati. In effetti li ho sempre costruiti a mano da solo.

Questo significa che si può andare e li modifica senza preoccuparsi di loro ottenere colpita :-)

SpecFlow opere di auto-generazione di file * .feature.cs ogni volta che si modifica un file * .Feature. Questi non dovrebbero mai essere modificati, ma se li guardi puoi vedere che in pratica prendono le linee Given, When e Then dai tuoi scenari e le passano come argomenti ai propri metodi interni. Dietro le quinte, SpecFlow utilizza la riflessione per trovare tutte le classi che hanno un attributo [Binding] su di esse, quindi esamina tutti quei metodi di classi che hanno attributi [Given], o [Then] per trovare un elenco di espressioni regolari. La regex di corrispondenza migliore identifica il metodo da chiamare. Questo è il motivo per cui i binding sono spesso descritti come globali e non dovrebbero essere realmente costruiti usando l'ereditarietà (quando si hanno più regex identiche).

Tornando ai binding generati che si hanno, questi vengono creati nell'editor solo quando il plugin VS di SpecFlow rileva che non si ha una regex corrispondente e si prova a navigare verso una definizione (F12) in un file di funzionalità . Sono davvero dei segnaposti tra cui puoi costruire.

+4

Concordato. Tratta la regex generata automaticamente come solo un suggerimento, non sempre la ottiene perfettamente (l'elaborazione del linguaggio naturale è difficile). Un consiglio, se si attaccano citazioni su cose come e nei passaggi, a volte fornisce a SpecFlow un suggerimento sufficiente per generare risultati più sensibili. Ad esempio 'E nome utente" "e password" "è un account valido' causerà SpecFlow per generare il passo con' [Given (@ "Username" "(. *)" "E password" "(. *) "" è un account valido ")]'. –

0

È necessario utilizzare virgolette singole per indicare che SpecFlow deve utilizzare l'intera stringa anziché il numero.

Examples: 
| username   | password  | 
| '[email protected]' | 'password001' | 
| 'valid002'   | 'password002' | 
Problemi correlati