Pregunta

Behat busca de forma predeterminada las definiciones de pasos en el archivo llamado FeatureContext (todos los pasos en un solo archivo).
Al tener tantos pasos, es difícil mantener un archivo tan grande.

Me gustaría tener un archivo de definición por archivo de características.

¿Cómo puedo tener definiciones de pasos en archivos externos?

p.ej.

homepage.feature
HomepageContext extends FeatureContext
¿Fue útil?

Solución

Utilice la herencia de clases y contextos separados.

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

Luego, en /feature/FeatureContext.php, importe los archivos de contexto:

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

Otros consejos

Behat tiene múltiples opciones para dividir su FeatureContext en múltiples clases.Primero, puedes usar la herencia php5 de la vieja escuela.Si la herencia no es la que desea, Behat también admite subcontextos:"Usando subcontextos".

A continuación, si desea nombrar su clase de manera diferente a FeatureContext, puedes redefinirlo en "Configuración de contexto"sección de tu behat.yml archivo de configuración.

De esta manera, podría dividir definiciones y enlaces comunes en clases separadas y usarlos también en otros conjuntos de funciones, ya sea con subcontexto o herencia.

Pero tu pregunta también es:

Me gustaría tener un archivo de definición por archivo de características.

Esta petición es totalmente errónea.Behat and Scenario BDD se trata de describir el comportamiento de su aplicación en términos comerciales y crear un diccionario de prueba para los comportamientos descritos.Teniendo esto en cuenta, lógicamente no se podrían tener varios diccionarios diferentes para un conjunto de funciones.Al escribir definiciones de pasos, le estás diciendo a Behat lo que eso Given I am on "/news" medio.Y cuando quieres que ese paso signifique cosas diferentes de una característica a otra, lo estás haciendo mal.

Behat consta de 2 conceptos principales y bastante separados:

  1. *.feature archivos, escritos en lenguaje Gherkin.Esos archivos deben ser autodescriptivos.Significa que deben proporcionar toda la información al lector para que pueda comprenderlos.Gherkin no es un nuevo lenguaje de programación para tus pruebas funcionales, es solo un reducción para tus historias de usuario!
  2. FeatureContext.php clases, describe cómo Behat debería probar sus funciones.Define un diccionario para toda la aplicación que se utilizará con todo el conjunto de funciones de la aplicación.Este es un puente de programación entre su reducción-como historias de usuarios y pruebas funcionales reales.

Y no deberías estropear estas cosas.El conjunto de funciones únicas debe tener un diccionario de pasos individuales (definiciones).Pero podrías usar un diccionario único en más de un conjunto de funciones gracias a la herencia y los subcontextos.Y sí, puedes dividir el diccionario de un solo conjunto en varias clases de PHP ;-)

Una solución es la reutilización horizontal con subcontextos.Utilice un subcontexto para cada "grupo de funciones".

class FeatureContext extends BehatContext
{

    public function __construct(array $context_parameters)
    {
        $this->useContext('math_context', new MathContext());
        $this->useContext('bash_context', new BashContext());
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top