Pergunta

Por padrão, o Behat procura as definições das etapas no arquivo chamado FeatureContext (todas as etapas em um arquivo).
Com muitas etapas, é difícil manter um arquivo tão grande.

Eu gostaria de ter um arquivo de definição por arquivo de característica.

Como posso ter definições de etapas em arquivos externos?

por exemplo,

homepage.feature
HomepageContext extends FeatureContext
Foi útil?

Solução

Use herança de classe e contextos separados.

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

Em seguida, em /feature/FeatureContext.php importe os arquivos 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));
           }
        }
    }
}

Outras dicas

Behat tem várias opções para você dividir seu FeatureContext em várias classes. Primeiro, você pode usar a herança php5 da velha escola. Se a herança não for o que você deseja, o Behat também suporta subcontextos: " Usando subcontextos ".

A seguir, se quiser nomear sua classe de maneira diferente de FeatureContext, você pode redefinir isso em " Configuração de contexto " do arquivo de configuração behat.yml.

Dessa forma, você pode dividir as definições e ganchos comuns em classes separadas e usá-los em outros conjuntos de recursos, bem como com subcontexto ou herança.

Mas sua pergunta também pergunta:

Eu gostaria de ter um arquivo de definição por arquivo de característica.

Este pedido está totalmente errado. Behat and Scenario BDD descreve o comportamento do seu aplicativo em termos de negócios e cria um dicionário de teste para os comportamentos descritos. Tendo isso em mente, você logicamente não poderia ter vários dicionários diferentes para um conjunto de recursos. Ao escrever as definições das etapas, você está dizendo ao Behat o que significa esse Given I am on "/news". E quando você quer que essa etapa signifique coisas diferentes de um recurso para outro, você está fazendo isso errado.

O Behat consiste em 2 conceitos principais e suficientemente separados:

  1. arquivos *.feature, escritos na linguagem Gherkin. Esses arquivos devem ser autodescritivos. Significa que devem fornecer ao leitor todas as informações para compreendê-los. Gherkin não é uma nova linguagem de programação para seus testes funcionais, é apenas uma marcação para suas histórias de usuário!
  2. classes FeatureContext.php, descreve como o Behat deve testar seus recursos. Ele define o dicionário de todo o aplicativo a ser usado com todo o conjunto de recursos do aplicativo. Esta é uma ponte de programação entre suas histórias de usuário markdown e testes funcionais reais.

E você não deve bagunçar essas coisas. O conjunto de recursos único deve ter um dicionário de etapas simples (definições). Mas você pode usar um único dicionário em mais de um conjunto de recursos, graças à herança e aos subcontextos. E sim, você pode dividir o dicionário de suíte única em várias classes de php ;-)

Uma solução é a reutilização horizontal com subContexts.Use um subContexto para cada "grupo de recursos".

class FeatureContext extends BehatContext
{

    public function __construct(array $context_parameters)
    {
        $this->useContext('math_context', new MathContext());
        $this->useContext('bash_context', new BashContext());
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top