Настройка тэсту кантролера з ZendFramework: выпуск Autoloader

Я працую на вэб-дадатак з Zend Framework v1.11.0, але я не ў стане ўсталяваць правільную тэставую сераду для выпрабаванняў кантролера. Я ведаю, што ўжо ёсць шмат пытанняў пра наладу тэсту Zend, аднак, пасля некалькіх гадзін даследаванняў, ні адзін з іх не фіксаваных маёй праблемы. Дык вось мой код:

Тэст Bootstrap:

<?php
error_reporting(E_ALL | E_STRICT);

defined('APPLICATION_PATH') || define('APPLICATION_PATH',realpath(dirname(__FILE__).'/../../application'));
define('APPLICATION_ENV', 'testing');
set_include_path(implode(PATH_SEPARATOR, array(realpath(APPLICATION_PATH.'/../library'), get_include_path())));

require_once ('Zend/Application.php');
require_once ('ControllerTestCase.php');

ControllerTestCase:

class ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase {

  public $application;

  public function setUp() {
    $this->bootstrap = array($this, 'appBootstrap');
    parent::setUp();
  }

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

Просты тэст:

class IndexControllerTest extends ControllerTestCase {
    public function testDefaultShouldInvokeIndexAction()
    {
        $this->dispatch('/');
        $this->assertModule('default');
        $this->assertController('index');
        $this->assertAction('index');
    }
}

Everytime я бег гэтага тэсту, PHPUnit кідае паведамленне фатальнай памылкі не знайсці клас у маёй бібліятэцы, якая выкарыстоўваецца ў маім IndexController. Таму прычына павінна быць што-то звязана з автозагрузчика, падумаў я. Пасля адладкі я выявіў, што тэст праходзіць праз рэгулярны Bootstrap, карыта Убудова Auth і гэтак далей, і што мае бібліятэкі з'яўляюцца ўключаны. Так што я паняцця не маю, што можа быць праблема PHPUnit ст. У браўзэры усё выдатна працуе і без кантролера тэстаў у камандным радку (напрыклад, глабальныя налады) працы таксама.

Я быў бы вельмі ўдзячны за любы намёк, што мне трэба зрабіць, каб атрымаць мае тэсты кантролера працуюць!

рэдагаваць: моя структуру каталогаў выглядае наступным чынам (я падзяліў свае класы ў розныя бібліятэкі па пэўных прычынах)

project
 - library1
 - library2
 - project_name
    ->application
    ->library3
    ->library4
    ->tests
       ->>application
          ->>>ControllerTestCase.php
          ->>>Bootstrap.php
       ->>Controller
          ->>>IndexControllerTest.php

мой ўключаюць шляху выглядаюць на самай справе падабаюцца:

set_include_path(implode(PATH_SEPARATOR, array(realpath(APPLICATION_PATH.'/../library3'), get_include_path())));
set_include_path(implode(PATH_SEPARATOR, array(realpath(APPLICATION_PATH.'/../library4'), get_include_path())));
set_include_path(implode(PATH_SEPARATOR, array(realpath(APPLICATION_PATH.'/../../library1'), get_include_path())));
set_include_path(implode(PATH_SEPARATOR, array(realpath(APPLICATION_PATH.'/../../library2'), get_include_path())));
0

2 адказы

У маім уласным ControllerTestCase класа I ўсталяваць загрузны аб'ект у канструктару замест Налада функцыі. Так што для вас гэта будзе азначаць, каб змяніць

public function setUp() {
    $this->bootstrap = array($this, 'appBootstrap');
    parent::setUp();
}

у

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

і выдаленне appBootstrap метад. Гэта сапраўды адзінае адрозьненьне, якое я бачу паміж вашым кодам і маім уласным кодам. Я гэта не вырашае праблему, то, хутчэй за ўсё, вашы налады шляху выключаныя.

1
дададзена
Можа быць, вы можаце размясціць агляд структуры каталогаў? Для вашай бібліятэкі, прыкладання і тэставага кода.
дададзена аўтар Jan-Henk, крыніца
Існуюць чатыры званкоў на set_include_path() вы адрэдагаваныя ў ваша пытанне таксама выконваюцца ў файле пачатковай загрузкі тэставага? Паколькі ў гэтым прыкладзе кода вы падалі ёсць толькі адзін выклік.
дададзена аўтар Jan-Henk, крыніца
Дзякуй за ваш адказ! Я паспрабаваў гэта змена, аднак з'яўляецца тая ж памылка. Я пагляджу на параметры шляху, але, як ён працуе ў браўзэры я даволі ўпэўнены, што яны маюць рацыю.
дададзена аўтар nick, крыніца
Так, я рэдагаваў яго пытанне.
дададзена аўтар nick, крыніца
Так, яны ўключаныя, я проста скараціў код, каб захаваць яго простым
дададзена аўтар nick, крыніца

Самы просты спосаб, каб правільна наладзіць тэставы прыклад для Zend кантролер выкарыстоўваць інструмент ОГНЯ. Ствараючы свае кантралёры з ім, вы атрымаеце аўтаматычна згенераваныя тэставыя выпадкі для іх.

zf create controller name index-action-included[=1] module

Ствараецца самазагрузкі:

    defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'testing'));

set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    get_include_path(),
)));

require_once 'Zend/Loader/Autoloader.php';

... і controllerTestCase:

class IndexControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{

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

    ....tests.........
}

You have to add the include paths in the bootstrap and register any custom test autoloaders with spl_autoloader. Also, remember to start phpunit with -c test/phpunit.xml

0
дададзена