2011-09-11 7 views
8

Behat per impostazione predefinita cerca le definizioni di passaggio nel file denominato FeatureContext (tutti i passaggi in un file).
Avendo molti passaggi, è difficile mantenere un file così grande.Definizioni passo in file esterni in Behat

Mi piacerebbe avere un file di definizione per file di funzionalità.

Come posso avere definizioni di passo in file esterni?

ad es.

homepage.feature 
HomepageContext extends FeatureContext 

risposta

6

Utilizzare l'ereditarietà della classe e i contesti separati.

# /features/contexts/ 
AbstractContext extends BehatContext {} 
FeaturenameContext extends AbstractContext {} 

Poi nel /feature/FeatureContext.php importare i file di contesto:

/** 
* Initializes context. 
* Every scenario gets it's own context object. 
* 
* @param array $parameters context parameters (set up via behat.yml) 
*/ 
public function __construct(array $parameters) { 

    // import all context classes from context directory, except the abstract one 

    $filesToSkip = array('AbstractContext.php'); 

    $path = dirname(__FILE__) . '/../contexts/'; 
    $it = new RecursiveDirectoryIterator($path); 
    /** @var $file SplFileInfo */ 
    foreach ($it as $file) { 
     if (!$file->isDir()) { 
      $name = $file->getFilename(); 
      if (!in_array($name, $filesToSkip)) { 
       $class = pathinfo($name, PATHINFO_FILENAME); 
       require_once dirname(__FILE__) . '/../context/' . $name; 
       $this->useContext($class, new $class($parameters)); 
      } 
     } 
    } 
} 
24

Behat ha più opzioni per suddividere il FeatureContext in più classi. In primo luogo, è possibile utilizzare l'ereditarietà php5 vecchia scuola. Se l'ereditarietà non è ciò che desideri, Behat supporta anche i sottocontesti: "Using Subcontexts".

Successivamente, se si desidera denominare la classe in modo diverso da FeatureContext, è possibile ridefinirlo nella sezione "Context Configuration" del proprio file di configurazione behat.yml.

In questo modo, è possibile dividere definizioni e hook comuni in classi separate e utilizzarli in altre feature suite con il subcontesto o l'ereditarietà.

Ma la tua domanda chiede anche:

Mi piacerebbe avere un file di definizione per file funzione.

Questa richiesta è totalmente errata. Behat e Scenario BDD si occupa di descrivere il comportamento dell'applicazione in termini commerciali e creare un dizionario di test per i comportamenti descritti. Tenendo presente ciò, non è possibile avere logicamente più dizionari diversi per un set di funzionalità. Scrivendo le definizioni dei passaggi, stai dicendo a Behat cosa significa questo Given I am on "/news". E quando vuoi che quel passaggio significhi cose diverse da una caratteristica all'altra - stai sbagliando.

Behat si compone di 2 principali e abbastanza concetti distinti:

  1. *.feature file, scritti in un linguaggio Gherkin. Questi file dovrebbero essere auto-descrittivi. Significa che dovrebbero fornire tutte le informazioni per il lettore al fine di capirle. Gherkin non è un nuovo linguaggio di programmazione per i tuoi test funzionali, è solo un markdown per le tue storie di utenti!
  2. classi FeatureContext.php, descrive come Behat deve testare le funzionalità. Definisce un dizionario a livello di applicazione da utilizzare con l'intera suite di applicazioni. Questo è un ponte di programmazione tra il tuo markup , come storie utente e test funzionali reali.

E non dovresti rovinare tutto. Una singola suite di funzioni dovrebbe avere un dizionario a passi singoli (definizioni). Ma potresti usare un singolo dizionario in più di una suite di funzioni grazie all'ereditarietà e ai sottocontesti. E sì, puoi dividere il dizionario della suite singola in più classi php ;-)

+0

Ho capito da dove vieni ma stai dimenticando il dolore di mantenere le tue specifiche? Il punto di Sfisioza (immagino) riguardava questo. Se qualcuno ha un sistema complesso, si potrebbe provare un tale dolore passando attraverso monolitici FeatureContext.php – RVM

0

Una soluzione è la riutilizzabilità orizzontale con sottocontesti. Usa un subContext per ogni "gruppo di caratteristiche".

class FeatureContext extends BehatContext 
{ 

    public function __construct(array $context_parameters) 
    { 
     $this->useContext('math_context', new MathContext()); 
     $this->useContext('bash_context', new BashContext()); 
    } 
} 
+0

Questo è vero solo per la versione 2.x di Behat. Il metodo 'useContext' è stato rimosso in Behat 3.x. –

+0

Quale sarebbe il sostituto di useContext in Behat3? –