Question

Behat par défaut recherche les définitions d'étape dans le fichier nommé FeatureContext (toutes les étapes d'un fichier).
Ayant beaucoup d'étapes, il est difficile de maintenir un si gros fichier.

Je voudrais avoir un fichier de définition par fichier de fonctionnalité.

Comment puis-je avoir des définitions de pas dans les fichiers externes?

par exemple

homepage.feature
HomepageContext extends FeatureContext
Était-ce utile?

La solution

Utilisez l'héritage de la classe et les contextes séparés.

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

Puis dans /feature/FeatureContext.php Importer les fichiers contextuels:

/**
 * 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));
           }
        }
    }
}

Autres conseils

Behat a plusieurs options pour que vous puissiez diviser votre FeatureContext en plusieurs classes. Tout d'abord, vous pouvez utiliser l'héritage PHP5 à l'ancienne. Si l'héritage n'est pas ce que vous voulez, Behat prend également en charge les sous-contextes: "En utilisant des sous-contextes".

Ensuite, si vous souhaitez nommer votre classe différemment de FeatureContext, vous pouvez redéfinir cela dans "Configuration de contexte"Section de votre behat.yml Fichier de configuration.

De cette façon, vous pouvez diviser des définitions et des crochets communs dans des classes distinctes et les utiliser dans d'autres suites de fonctionnalités avec un sous-contexlage ou un héritage.

Mais votre question vous demande également:

Je voudrais avoir un fichier de définition par fichier de fonctionnalité.

Cette demande est totalement erronée. Behat et Scénario BDD consistent à décrire votre comportement d'application en termes commerciaux et à créer un dictionnaire de test pour les comportements décrits. En gardant cela à l'esprit, vous ne pourriez logiquement pas avoir plusieurs dictionnaires différents pour un ensemble de fonctionnalités. En écrivant des définitions d'étape, vous dites à Behat ce que Given I am on "/news" moyens. Et lorsque vous voulez que cette étape signifie différentes choses, de la fonctionnalité à la fonctionnalité - vous vous trompez.

Behat se compose de 2 concepts principaux et suffisants:

  1. *.feature Fichiers, écrits en langue gherkin. Ces fichiers doivent être descriptifs. Signifie qu'ils devraient fournir toutes les informations au lecteur afin de les comprendre. Gherkin n'est pas un nouveau langage de programmation pour vos tests fonctionnels, c'est juste un réduction Pour vos histoires d'utilisateur!
  2. FeatureContext.php classes, décrit comment Behat devrait tester vos fonctionnalités. Il définit le dictionnaire à l'échelle de l'application à utiliser avec la suite de fonctionnalités d'application entière. Ceci est un pont de programmation entre votre réduction-Les histoires utilisateur et tests fonctionnels réels.

Et vous ne devriez pas gâcher cela. La suite de fonctionnalités unique doit avoir un dictionnaire à étapes uniques (définitions). Mais vous pouvez utiliser un dictionnaire unique dans plus d'une suite de fonctionnalités grâce à l'héritage et aux sous-contextes. Et oui, vous pouvez diviser le dictionnaire Single Suite en plusieurs classes PHP ;-)

Une solution est la réutilisabilité horizontale avec les sous-contextes. Utilisez un sous-contexte pour chaque "groupe de fonctionnalités".

class FeatureContext extends BehatContext
{

    public function __construct(array $context_parameters)
    {
        $this->useContext('math_context', new MathContext());
        $this->useContext('bash_context', new BashContext());
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top