2013-03-18 9 views
9

È possibile avere una classe di sottocontesto estendere un altro sottocontext e funzioni di sovrascrittura?È possibile sovrascrivere le definizioni di passo in un contesto behat?

Al momento ho

class TestContext extends BehatContext { 
    /** 
    * @Given /^a testScenarioExists$/ 
    */ 
    public function aTestscenarioexists() { 
     echo "I am a generic test scenario\n"; 
    } 
} 

e

class SpecialTestContext extends TestContext { 
    /** 
    * @Given /^a testScenarioExists$/ 
    */ 
    public function aTestscenarioexists() { 
     echo "I am a special test scenario\n"; 
    } 
} 

Nel contesto caratteristica dico che noi la SpecialTestContext come sottocontesto.

Quando eseguo il Behat di prova si lamenta con

[Behat \ Behat \ Exception \ RedundantException]
Step "/^a testScenarioExists $ /" è già definita in SpecialTestContext :: aTestscenarioexists()

Qualcuno può indicarmi la giusta direzione con questo?

Per dare qualche ulteriore informazioni sul motivo per cui sto cercando di raggiungere questo quello che sto cercando di realizzare è la possibilità di eseguire scenari con ambienti diversi, e hanno l'ambiente specificato nel file cetriolino, ad esempio:

Posso quindi aggiungere un po 'di codice in FeatureContext per caricare il sotto-contesto corretto.

risposta

4

In breve ... questo non è possibile: http://docs.behat.org/guides/2.definitions.html#redundant-step-definitions

In termini di subcontesti carico dinamico, questo non è possibile:

  1. subcontesti vengono caricati 'di compilazione' - ie. nel FeatureContext principale costruttore
  2. Con il tempo la prima definizione passo viene eseguito, Behat ha già raccolto tutte le annotazioni e mappato a intensificare le definizioni, non più può/deve essere aggiunto

check this out per capire come un Context si comporta: http://docs.behat.org/guides/4.context.html#contexts-lifetime

paio di cose più ampi da considerare:

  1. Anything catturati in uno scenario di mus cetriolino essere comprensibile dai non sviluppatori, (o almeno dagli sviluppatori che non hanno scritto il sistema!).Uno scenario dovrebbe trasmettere in pieno, una regola d'affari (idealmente non più) senza dover scavare in alcun codice

  2. Non si vuole nascondere troppa logica nelle definizioni di passo, qualsiasi regola deve essere catturata in un scenario cetriolino

  3. E 'fino al vostro modo di organizzare i FeatureContexts, tuttavia la vostra intenzione di voler fare questo per temi/domini all'interno del vostro sistema, ad esempio:

    • un DatabaseContext possono riguardare lettura + scrivendo a un test db
    • un ApiContext possono contenere misure che si occupano di convalida di un'API all'interno del vostro sistema
    • un CommandContext possono essere preoccupati di convalidare la console sistemi comandi
+0

Basta aggiornare i collegamenti sopra riportati. * http://docs.behat.org/en/latest/user_guide/context/definitions.html#redundant-step-definitions * http://docs.behat.org/en/latest/user_guide/context. html # contesti-lifetime – aczietlow

9

Come detto Rob Squires, il contesto caricamento dinamico non funzionerà.

Ma ho una soluzione alternativa per ignorare le definizioni di passaggio, che uso regolarmente. Non annotare il metodo. Behat rileverà l'annotazione del metodo sottoposto a override nella superclasse e mapperà il nome di quel metodo al passo corrispondente. Quando viene trovato un passo corrispondente, verrà invocato il metodo nella sottoclasse. Per rendere evidente, ho deciso di utilizzare l'annotazione @override per questo. L'annotazione @override non ha alcun significato speciale per Behat.

class SpecialTestContext extends TestContext { 
    /** 
    * @override Given /^a testScenarioExists$/ 
    */ 
    public function aTestscenarioexists() { 
     echo "I am a special test scenario\n"; 
    } 
} 
+1

Questa è la soluzione effettiva: sovrascrivere i metodi nella sottoclasse, senza modificare il modello docblock. –

0

Il metodo sovrascritto non può essere definito con la stessa frase.

class SpecialTestContext extends TestContext { 

    public function aTestscenarioexists() { 
    echo "I am a special test scenario\n"; 
    } 
} 
Problemi correlati