开发者

Zend Framework integration with Behat BDD

Anyone has b开发者_高级运维een using Behat with Zend Framework? Any examples on how to use both?


I got it working. It works with PHPUnit and Zend_Test so you can use all those nifty assertXYZ() methods. First, make sure you've got behat installed and available in your system $PATH. I did the following:

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

Now, create a directory structure like so:

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

The features/application/ControllerTestCase.php class is typical of a Zend_Test testing implementation:

<?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();
    }
}

The features/bootstrap/FeatureContext.php class is what Behat needs to bootstrap itself:

<?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();
    }

}

And now you can write features like 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"

To run the tests, cd to the directory that contains the features folder, and type behat.

Good luck!


Codeception has module for Zend Framework. It's much like Behat, but tests are written in PHP DSL and not in Gherkin.


My scenario was always stopping at the first step. I finally figured it out, there was a die or and exit somewhere in my code which was halting behat completety. So make sure your app doesn't contain any die or exit. Now it's working fine.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜