Интеграция Zend Framework с Behat BDD

#php #zend-framework #tdd #bdd #behat

#php #zend-framework #tdd #bdd #behat

Вопрос:

Кто-нибудь использовал Behat с Zend Framework? Есть примеры того, как использовать оба?

Комментарии:

1. Я думаю, что вы могли бы быть пионером в этом каким-то образом. Я даже не слышал о behat. на сайте это звучит и выглядит полезным.

2. Какие элементы вашего приложения вы хотите протестировать? Полный стек, пользовательский интерфейс, API? Существует ряд различных подходов в зависимости от ваших целей тестирования.

Ответ №1:

У меня получилось. Она работает с PHPUnit и Zend_Test , поэтому вы можете использовать все эти изящные assertXYZ() методы. Во-первых, убедитесь, что он behat установлен и доступен в вашей системе $PATH . Я сделал следующее:

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

Теперь создайте структуру каталогов следующим образом:

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

features/application/ControllerTestCase.php Класс типичен для Zend_Test тестируемой реализации:

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

features/bootstrap/FeatureContext.php Класс — это то, что нужно Behat для начальной загрузки:

 <?php

use BehatBehatContextClosuredContextInterface,
    BehatBehatContextTranslatedContextInterface,
    BehatBehatContextBehatContext,
    BehatBehatExceptionPendingException;
use BehatGherkinNodePyStringNode,
    BehatGherkinNodeTableNode;

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

}
  

И теперь вы можете писать такие функции, как 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"
  

Чтобы запустить тесты, cd перейдите в каталог, содержащий features папку, и введите behat .

Удачи!

Комментарии:

1. Есть ли способ сохранить определения шагов в отдельных файлах? Не все из них в одном FeatureContext классе?

2. похоже, у меня это не работает. должно быть, загрузчик ZF вызывается несколько раз, потому что я получаю «Постоянные уже определенные» ошибки

Ответ №2:

Codeception имеет модуль для Zend Framework. Это очень похоже на Behat, но тесты написаны на PHP DSL, а не на Gherkin.

Ответ №3:

Мой сценарий всегда останавливался на первом шаге. Я, наконец, понял это, где-то в моем коде была кнопка die или и exit, которая останавливала выполнение. Поэтому убедитесь, что в вашем приложении нет элементов die или exit. Теперь все работает нормально.