2011-04-14 13 views
16

¿Alguien ha estado usando Behat con Zend Framework? ¿Algún ejemplo sobre cómo usar ambos?Zend Framework integración con Behat BDD

+1

Creo que puede ser un pionero en esto de alguna manera. Ni siquiera había oído hablar de behat. suena y parece útil desde el sitio. –

+0

¿Qué elementos de su aplicación está buscando probar? Pila completa, interfaz de usuario, API? Existen diferentes enfoques según sus objetivos de prueba. –

Respuesta

12

Lo tengo trabajando. Funciona con PHPUnit y Zend_Test por lo que puede utilizar todos los métodos nifty assertXYZ(). Primero, asegúrese de tener behat instalado y disponible en su sistema $PATH. Hice lo siguiente:

sudo pear channel-discover pear.symfony.com 
sudo pear channel-discover pear.behat.org 
sudo pear install behat/behat 

Ahora, crear una estructura de directorios, así:

features 
    application 
     ControllerTestCase.php 
    bootstrap 
     FeatureContext.php 
    homepage.feature 

La clase features/application/ControllerTestCase.php es típico de una aplicación Zend_Test prueba:

<?php 
require_once 'Zend/Application.php'; 
require_once 'Zend/Test/PHPUnit/ControllerTestCase.php'; 

class ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase { 

    public $application; 

    public function setUp() { 
     $this->application = new Zend_Application(APPLICATION_ENV, APPLICATION_PATH 
       . '/configs/application.ini'); 
     $this->bootstrap = array($this, 'appBootstrap'); 
     parent::setUp(); 
    } 

    public function appBootstrap(){ 
     $this->application->bootstrap(); 
    } 
} 

La clase features/bootstrap/FeatureContext.php es lo que Behat necesita para iniciarse a sí mismo:

<?php 

use Behat\Behat\Context\ClosuredContextInterface, 
    Behat\Behat\Context\TranslatedContextInterface, 
    Behat\Behat\Context\BehatContext, 
    Behat\Behat\Exception\PendingException; 
use Behat\Gherkin\Node\PyStringNode, 
    Behat\Gherkin\Node\TableNode; 

require_once 'PHPUnit/Autoload.php'; 
require_once 'PHPUnit/Framework/Assert/Functions.php'; 

define('APPLICATION_ENV', 'testing'); 
define('APPLICATION_PATH', dirname(__FILE__) . '/../path/to/your/zf/application'); 

set_include_path('.' . PATH_SEPARATOR . APPLICATION_PATH . '/../library' 
     . PATH_SEPARATOR . get_include_path()); 

require_once dirname(__FILE__) . '/../application/ControllerTestCase.php'; 

class FeatureContext extends BehatContext { 

    protected $app; 

    /** 
    * 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) { 
     $this->app = new ControllerTestCase(); 
     $this->app->setUp(); 
    } 

    /** 
    * @When /^I load the URL "([^"]*)"$/ 
    */ 
    public function iLoadTheURL($url) { 
     $this->app->dispatch($url); 
    } 

    /** 
    * @Then /^the module should be "([^"]*)"$/ 
    */ 
    public function theModuleShouldBe($desiredModule) { 
     $this->app->assertModule($desiredModule); 
    } 

    /** 
    * @Given /^the controller should be "([^"]*)"$/ 
    */ 
    public function theControllerShouldBe($desiredController) { 
     $this->app->assertController($desiredController); 
    } 

    /** 
    * @Given /^the action should be "([^"]*)"$/ 
    */ 
    public function theActionShouldBe($desiredAction) { 
     $this->app->assertAction($desiredAction); 
    } 

    /** 
    * @Given /^the page should contain a "([^"]*)" tag that contains "([^"]*)"$/ 
    */ 
    public function thePageShouldContainATagThatContains($tag, $content) { 
     $this->app->assertQueryContentContains($tag, $content); 
    } 

    /** 
    * @Given /^the action should not redirect$/ 
    */ 
    public function theActionShouldNotRedirect() { 
     $this->app->assertNotRedirect(); 
    } 

} 

Y ahora se puede escribir funciones como features/homepage.feature:

Feature: Homepage 
    In order to know ZF works with Behat 
    I need to see that the page loads. 

Scenario: Check the homepage 
    Given I load the URL "/index" 
    Then the module should be "default" 
    And the controller should be "index" 
    And the action should be "index" 
    And the action should not redirect 
    And the page should contain a "title" tag that contains "My Nifty ZF App" 

para ejecutar las pruebas, cd al directorio que contiene la carpeta features y escriba behat.

¡Buena suerte!

+0

¿Hay alguna manera de tener definiciones de pasos en archivos separados? ¿No todos en una clase 'FeatureContext'? – takeshin

+0

esto no parece funcionar para mí. el ZF bootstrap se debe llamar varias veces, porque obtengo errores "Constant already defined" – Andrew

0

Mi escenario siempre se detenía en el primer paso. Finalmente lo descubrí, había un dado oy salí a algún lado de mi código que se detenía por completo. Así que asegúrese de que su aplicación no contenga ningún dado o salida. Ahora está funcionando bien.