2014-05-13 5 views
5

SituationBehat 3 innerhalb symfony2.4 (Lehre Zugang)

Ich will von jetzt an in meinen symfony Projekten BDD und Behat verwenden. Das aktuelle Projekt ist SF2.4, und ich bemühe mich, Behat 3 zum Laufen zu bringen. Ich verwende the latest doc concerning behat3, wie von jakub in this post empfohlen.

Ausgabe

Behat 3 scheint gut zu funktionieren. Um jedoch wirklich starten zu können, muss ich Zugriff auf den Kernel haben (Container, Doktrin, etc ...). Ich habe es mit meinem Projekt probiert, ein Testprojekt, das ein Beispiel für Behat darstellt. Jedoch unter Verwendung von $ this-> Container() $ this-> Kernel-> getContainer() immer eine 'anhängige Ausnahme' wirft (Code stoppt bei iShouldGet Schritt):

public function iShouldGet(PyStringNode $string) 
{ 
    //$container = $this->kernel->getContainer(); 
    //$container = $this->getContainer(); 
    //$doctrine = $this->getContainer()->get('doctrine'); 
    if ((string) $string !== $this->output) { 
     throw new Exception(
      "Actual output is:\n" . $this->output 
     ); 
    } 
} 

Ich habe versucht, die gleiche Behat zu erstellen 'ls' Test innerhalb AcmeDemoBundle:

|Acme 
    |Demo 
     |Features 
      |Context/FeatureContext.php 
      ls.feature 

aber es löst einen Fehler:

[Behat\Testwork\Tester\Exception\WrongPathsException]  
No specifications found at path(s) `@AcmeDemoBundle`. 

Lösung

Es könnte an der Verwendung von Behat3 liegen, aber ich bin mir nicht sicher. Irgendein Hinweis, warum dieses Problem auftritt/wie man es löst? Im Allgemeinen werden gute Ratschläge zur Integration von behat in das symfony2 (2.4) Projekt sehr geschätzt.

Vielen Dank im Voraus.

Grüße,


NB: Hier sind meine Dateien:

behat.yml

# behat.yml 
default: 
    suites: 
     my_suite: 
      type: symfony_bundle 
      bundle: AcmeDemoBundle 
      mink_session: default 
      mink_javascript_session: selenium2 
    extensions: 
     #Behat\MinkExtension\Extension: 
     #Behat\MinkExtension\ServiceContainer\MinkExtension: 
     Behat\MinkExtension: 
      base_url: 'http://demo.com' 
      # this will be the url of our application 
      #base_url: 'http://wikipedia.org' 
      sessions: 
       default: 
        goutte: ~ 
       selenium2: 
        selenium2: ~ 
     Behat\Symfony2Extension: ~ 

app/autoload.php

<?php 

use Doctrine\Common\Annotations\AnnotationRegistry; 
use Composer\Autoload\ClassLoader; 

/** 
* @var ClassLoader $loader 
*/ 
$loader = require __DIR__.'/../vendor/autoload.php'; 

AnnotationRegistry::registerLoader(array($loader, 'loadClass')); 


$loader->add('Behat\Gherkin',realpath(__DIR__.'/../vendor/behat/gherkin/src')); 
$loader->add('Behat\Behat' ,realpath(__DIR__.'/../vendor/behat/behat/src')); 
$loader->add('Behat\BehatBundle' ,realpath(__DIR__.'/../vendor/bundles')); 

return $loader; 

Antwort

0

Mit Behat 3.0. 14, und symfony 2.3, musste ich das hinzufügen se Aussage an der Spitze der FeatureContext Klasse:

use Behat\Symfony2Extension\Context\KernelAwareContext; 
use Behat\Symfony2Extension\Context\KernelDictionary; 

Der Feature-Class auch die KernelAwareContext Schnittstelle so implementieren benötigt:

class FeatureContext extends MinkContext implements KernelAwareContext 

Danach konnte ich symfony Behälter in den FeatureContext zugreifen Klasse, wie im Beispiel unten step argument transfomation:

/** 
* @Transform :location 
*/ 
public function castAddressToLocation($location) 
{ 
    return $this->getContainer()->get('geocoder')->getLocation($location); 
} 
2

Bisher dies immer für mich gearbeitet. Ich habe Beispielanwendungen für Ihre Gherkin hinzugefügt, so dass es ziemlich geradlinig ist.

use Behat\MinkExtension\Context\MinkContext; 
use Behat\Symfony2Extension\Context\KernelAwareContext; 
use Symfony\Component\HttpKernel\KernelInterface; 

class FeatureContext extends MinkContext implements KernelAwareContext 
{ 
    protected $kernel; 

    public function setKernel(KernelInterface $kernelInterface) 
    { 
     $this->kernel = $kernelInterface; 
    } 

    /** 
    * @Given /^I can access service container$/ 
    */ 
    public function iCanAccessServiceContainer() 
    { 
     $container = $this->kernel->getContainer(); 
     return $container->getParameter('whatever'); 
    } 

    /** 
    * @Given /^I can access entity manager$/ 
    */ 
    public function iCanAccessEntityManager() 
    { 
     $em = $this->kernel->getContainer()->get('doctrine')->getManager(); 
     // So on 
    } 

    /** 
    * @Given /^I can access repository$/ 
    */ 
    public function iCanAccessRepository() 
    { 
     $em = $this->kernel->getContainer()->get('doctrine')->getManager(); 
     $repo = $em->getRepository('WhateverBundle:WhateverEntity'); 
     // So on 
    } 
}