问题
I am using unit test to test zend project, this is 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
this is the 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>
this is the 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';
this is the 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();
}
}
this is the IndexControllerTest.php
<?php
require_once 'Zend/Test/PHPUnit/ControllerTestCase.php'; class IndexControllerTest extends ControllerTestCase {
public function testHomePage() {
$this->dispatch('/index');
$this->assertController('index');
$this->assertAction('menu');
}
}
when I go the the tests folder, run command phpunit, it gives me this error:
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
How can I fix this problem?
When I change the IndexControllerTest as one test, such as:
<?php
class IndexControllerTest extends ControllerTestCase
{
public function testHomePage() {
$this->assertTrue(true);
}
}
it works, but when I change it to
<?php
class IndexControllerTest extends ControllerTestCase
{
public function testHomePage() {
$this->dispatch('/');
}
}
The 46 line in ErrorController.php is:
public function getLog() {
$bootstrap = $this->getInvokeArg('bootstrap');
if (!$bootstrap->hasResource('Log')) {// this is line 46
return false;
}
$log = $bootstrap->getResource('Log');
return $log;
}
it still give me the same error, any suggestion?
回答1:
Try with this IndexControllerTest class
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']);
}
}
来源:https://stackoverflow.com/questions/5789733/need-help-for-the-zend-unit-test