2012-07-26 19 views
10

Mi sto bagnando i piedi con SpecFlow e mi diverto davvero.SpecFlow - Ordinamento di più metodi di BeforeScenario

Tranne alcuni problemi spinosi ... come il codice di configurazione delle funzionalità e degli scenari.

In un unico file "general-purpose" chiamato InfrastructureSteps.cs, ho codice di setup generale che dovrebbe essere eseguito per tutti gli scenari - quindi il mio metodo simile a questa:

[BeforeScenario] 
public void SetupDbContext() 
{ 
    // define some basic stuff, set up a database transaction context etc. 
} 

Questo deve essere eseguito prima ogni scenario e, finora, ha funzionato bene.

Ma ora, ho due scenari in un file di passaggi specifici del test che richiede anche un'impostazione piuttosto estesa prima che possano essere eseguiti. Così ho segnato il loro scenario nel .feature con un tag:

@needs_extra_setup 
Scenario: ..... 
    Given ..... 
    When ..... 
    Then ...... 

e implementato un metodo BeforeScenario configurazione specifica-test:

[BeforeScenario("needs_extra_setup")] 
public void DoExtraSetupForMyScenario() 
{ 
    // do stuff 
} 

Funziona - è viene chiamato - ma viene chiamato prima il metodo [BeforeScenario] per uso generico viene chiamato :-(e quindi fallisce - roba che viene configurata in quel metodo di installazione generico non è presente e causa il fallimento del codice

Quindi, c'è qualche modo in SpecFlow per ordinare i metodi [BeforeScenario]? Oppure posso dire ad uno specifico metodo [BeforeScenario] di eseguire prima un metodo "base" [BeforeScenario] come chiamare un metodo base in un metodo sovrascritto?

Naturalmente potrei chiamare che "base" [BeforeScenario] metodo esplicitamente - ma che sembra un po 'come un approccio maglio .....

Tutte le idee? Pensieri? Puntatori?

risposta

7

Sono abbastanza sicuro che è possibile (e probabilmente non dovrebbe) ordinare l'ordine di esecuzione dei propri scenari.

Ma potreste usare qualche altro hooks come BeforeFeature e magari girarlo in quel modo.

Un altro modo è semplicemente avere un flag che controlli se le cose generali sono state impostate nello specifico, chiamando nel metodo SetupDbContext (o preferibilmente la cosa che SetupDbContext chiama a sua volta).

Utilizzare il dizionario ScenarioContext.Current per memorizzare le bandiere.

Spero abbiate trovato utile

+0

È inoltre possibile utilizzare FeatureContext.Current per l'uso con BeforeFeature – Heliac

4

Ho avuto lo stesso problema. Ho finito per utilizzare

if(ScenarioContext.Current.ScenarioInfo.Tags.Contains("needs_extra_setup")) 

alla fine del metodo [BeforeScenario]. È descritto nella pagina già collegata da Marcus: SpecFlow Hooks

+0

Grazie per questo! Cercavo un modo per discriminare tra test di accettazione Web (cioè Selenium) e non web, che la documentazione di Hooks mi forniva esattamente ciò di cui avevo bisogno :) –

1

Questo è ora possibile nella v2 di specflow, che è in versione beta al momento della scrittura.

Gli attributi di associazione di passi hanno una proprietà di ordine facoltativa che consente di specificare l'ordine dei ganci. I numeri più piccoli verranno elaborati per primi e il valore dell'ordine predefinito è 10.000.

+0

Grazie! - '[Ordine]' è entrato nella [versione finale] (http://www.specflow.org/documentation/Hooks/) – StuartLC

Problemi correlati