Я использую модульный тест для тестирования проекта zend, это application.ini
[production] phpSettings.display_startup_errors = 0 phpSettings.display_errors = 0 resources.frontController.params.displayExceptions = 0 includePaths.library = APPLICATION_PATH "/../library" bootstrap.path = APPLICATION_PATH "/Bootstrap.php" bootstrap.class = "Bootstrap" appnamespace = "Application" ; modules resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers" resources.frontController.moduleControllerDirectoryName = "controllers" resources.frontController.moduleDirectory = APPLICATION_PATH "/modules" resources.modules[] = "" resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts" resources.layout.layout = "layout" resources.view[] = resources.view.doctype = "XHTML1_STRICT" ; database resources.db.adapter = "PDO_MYSQL" resources.db.params.dbname = "demodev" resources.db.params.password = "demo_core_pass" resources.db.params.username = "demo_core_user" resources.db.params.host = "localhost" resources.db.isDefaultTableAdapter = true ; session resources.session.save_path = APPLICATION_PATH "/../data/session" resources.session.use_only_cookies = true ;resources.session.remember_me_seconds = 10 [staging : production] [testing : production] phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1 [development : production] phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1 resources.frontController.params.displayExceptions = 1 [amsterdam : production] phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1 resources.frontController.params.displayExceptions = 1
это phpunit.xml:
<phpunit bootstrap="./application/bootstrap.php" colors="true"> <testsuite> <directory>./</directory> </testsuite> <filter> <whitelist> <directory suffix="MyApp.php">../application/</directory> <exclude> <file>../application/Bootstrap.php</file> <file>../application/controllers/ErrorController.php</file> <directory suffix=".phtml">../application/</directory> </exclude> </whitelist> </filter> <logging> <log type="coverage-html" target="./log/report" charset="UTF-8" yui="true" highlight="true" lowUpperBound="50" highLowerBound="80"/> <log type="testdox-html" target="./log/testdox.html" /> </logging>
это bootstrap.php
<?php error_reporting(E_ALL); // Define path to application directory defined('APPLICATION_PATH') || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../../application')); // Define application environment defined('APPLICATION_ENV') || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'testing')); // Ensure library/ is on include_path set_include_path(implode(PATH_SEPARATOR, array( realpath(APPLICATION_PATH . '/../library'), get_include_path(), ))); require_once 'Zend/Application.php'; require_once 'ControllerTestCase.php'; //require_once 'MyApp.php';
это ControllerTestCase.php
<?php require_once 'Zend/Application.php'; require_once 'Zend/Test/PHPUnit/ControllerTestCase.php'; class ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase { protected $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(); } }
это IndexControllerTest.php
<?php
require_once 'Zend / Test / PHPUnit / ControllerTestCase.php'; class IndexControllerTest расширяет ControllerTestCase {
public function testHomePage() { $this->dispatch('/index'); $this->assertController('index'); $this->assertAction('menu'); }
}
когда я иду в папку тестов, запускаю команду phpunit, она дает мне эту ошибку:
D:\PHP\apache2\htdocs\demo_src\tests>phpunit PHPUnit 3.5.13 by Sebastian Bergmann. PHP Fatal error: Call to a member function hasResource() on a non-object in D:\ PHP\apache2\htdocs\demo_src\application\controllers\ErrorController.php on line 46 Fatal error: Call to a member function hasResource() on a non-object in D:\PHP\a pache2\htdocs\demo_src\application\controllers\ErrorController.php on line 46
Как я могу исправить эту проблему?
Когда я изменяю IndexControllerTest как один тест, например:
<?php class IndexControllerTest extends ControllerTestCase { public function testHomePage() { $this->assertTrue(true); } }
он работает, но когда я меняю его на
<?php class IndexControllerTest extends ControllerTestCase { public function testHomePage() { $this->dispatch('/'); } }
Строка 46 в ErrorController.php:
public function getLog() { $bootstrap = $this->getInvokeArg('bootstrap'); if (!$bootstrap->hasResource('Log')) {// this is line 46 return false; } $log = $bootstrap->getResource('Log'); return $log; }
он все равно дает мне ту же ошибку, любое предложение?
Попробуйте этот класс IndexControllerTest
class IndexControllerTest extends Zend_Test_PHPUnit_ControllerTestCase { public function setUp() { $this->bootstrap = new Zend_Application( APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini' ); parent::setUp(); } public function testHomePage() { $params = array( 'action' => 'index', 'controller' => 'index', 'module' => 'default' ); $url = $this->url($this->urlizeOptions($params)); $this->dispatch($url); // assertions $this->assertModule($params['module']); $this->assertController($params['index']); $this->assertAction($params['action']); } }