2012-04-23 12 views
6

Come posso gestire al meglio il fatto che molti dei miei passaggi dovrebbero richiedere 0, 1 o anche 2 date come "primi parametri"? Ad esempio, come faccio meglio a rendere il supporto per gli argomenti opzionali in SpecflowParametri facoltativi con Specflow

Il caso più semplice è quando sono date di alcuna preoccupazione fino a quando le operazioni avvengono dopo l'altro

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

Spesso, però, un sacco di passi che sono dipendenti dal tempo, come ad esempio

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

altre volte ci sono due date, come la data in tempo reale e la data in cui era successo qualcosa. Per esempio. Peter ha compilato un modulo stampato 14-4-2012 per un trasferimento di denaro, ma il modulo si è perso per alcuni giorni e dobbiamo registrare oggi che il modulo è stato compilato pochi giorni fa.

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 

risposta

3

Preferisco la semplicità di più passaggi, ma se vuoi fare fare ciò che proponi, dovrai creare una regex appropriata. Qualcosa di simile (non testato):

[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

Due cose mi salta in testa:

In primo luogo ho ora un giorno non ti preoccupare di più di avere carichi di definizioni step, purché siano brevi (oneliners) e chiamando in una sorta di livello di automazione o DSL che mi aiuta ad automatizzare il sistema sotto test. Vedi questo excellent presentation per l'ispirazione.

Quindi in questo senso è possibile raddoppiare le definizioni di passaggio con "overload" per ciascun caso.

Il mio primo tentativo su una seconda soluzione era di impilare gli attributi uno sopra l'altro per lo stesso metodo. Funziona, ma non per i parametri opzionali. (E i parametri opzionali non funzionano bene con i tipi di riferimento come DateTime, ma DateTime? Nullable funziona). Se si aumentano i passaggi in questo modo si otterrà un errore come questo:

Errore di conteggio dei parametri! Il metodo di rilegatura 'Class1.MyGiven (Int32, Int32, Int32)' dovrebbe avere 1 parametri

Così cado di nuovo alla mia prima soluzione di questo tipo:

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

spero non mi causo troppa confusione andando avanti e indietro. Scusa - non avevo IDE pronto sul bus :)

+0

speravo in qualcosa in cui le date opzionali sono stati riscritta a partire dal applicherà alla maggior parte delle regole ... –

+0

non ha seguito lì ... Che cosa vuoi dire "refactoring out"? –

+0

Diciamo che hai 100 passi, con il tuo approccio ho bisogno di definire 300 passi .. piuttosto speravo che parte dei passaggi potesse essere relegata ad alcuni argomenti substring-parser –

0

Questo ha funzionato bene per me, il sovraccarico delle funzioni che richiedono parametri facoltativi e passando le impostazioni predefinite.

Sarebbe bello se specflow supportasse parametri opzionali, ad es. string searchTerm = "" ma non al momento.

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