testing with phpunit
I'm trying to test my controllers. I followed this guide:
http://www.zendcasts.com/unit-testing-a ... s/2010/11/
Everything was ok until I wanted to use this call in my test function: $this->dispatch('/'); I thing the problem is with bootstrapping, but I don't know how to resolve this. I paste my files involved in the testing:
application.ini = http://pastie.org/2248669
phpunit.xml =
<phpunit bootstrap="./application/bootstrap.php" colors="true">
<testsuite name="Application Test Suite">
<directory>./application</directory>
</testsuite>
<testsuite name="Library Test Suite">
<directory>./library</directory>
</testsuite>
<filter>
<!-- If Zend Framework is inside your project's library, uncomment this filter -->
<whitelist>
<directory suffix=".php">../application</directory>
<directory suffix=".php">../library/Kolcms</directory>
<exclude>
<directory suffix=".php">../library/Zend</directory>
<directory suffix=".php">../library/Kolcms/Model/DB</directory>
<directory suffix=".phtml">../library/</directory>
<directory suffix=".phtml">../application/</directory>
<file suffix=".php">../application/Bootstrap.php</file>
</exclude>
</whitelist>
</filter>
<logging>
<log type="coverage-html" target="./log/report" charset="UTF-8"
yui="true" highlight = "true" lowUpperBound="50" highLowerBound="80" />
</logging>
bootstrap.php =
<?php
// Define path to application directory
defined('APPLICATION_PATH')
|| define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../../application'));
// Define application environment
define('APPLICATION_ENV', 'testing');
// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
realpath(APPLICATION_PATH . '/../library'),
realpath(APPLICATION_PATH . '/../../../Zend'),
get_include_path()
)));
/** Zend_Application */
require_once 'Zend/Application.php';
require_once 'ControllerTestCase.php';
// Create application, bootstrap, and run
$application = new Zend_Application(
APPLICATION_ENV,
APPLICATION_PATH . '/configs/application.ini'
);
$application->bootstrap();
clearstatcache();
ControllerTestCase.php =
<?php
require_once 'Zend/Test/PHPUnit/ControllerTestCase.php';
class ControllerTestCase
extends Zend_Test_PHPUnit_ControllerTestCase
{
/**
*
* @var Zend_Application
*/
protected $application;
public function setUp()
{
$this->bootst开发者_运维知识库rap = array($this,'appBootstrap');
parent::setUp();
}
public function appBootstrap()
{
$this->application = new Zend_Application(
APPLICATION_ENV,
APPLICATION_PATH . '/configs/application.ini'
);
$this->application->bootstrap();
}
public function tearDown()
{
$this->resetRequest();
$this->resetResponse();
parent::tearDown();
}
}
indexControllerTest.php =
<?php
include_once APPLICATION_PATH . '/modules/core/controllers/IndexController.php';
class Core_IndexControllerTest extends ControllerTestCase
{
public function testDefaultShouldInvokeAction()
{
$this->dispatch('/core/index/index');
$this->assertController('index');
$this->assertAction('index');
$this->assertModule('core');
}
}
And here is my phpunit output:
$ phpunit
PHPUnit 3.5.5 by Sebastian Bergmann.
PHP Fatal error: Call to a member function hasResource() on a non-object in
/home/aykut/dev/kolonicms/application/modules/core/controllers/ErrorController.php on
line 49
Fatal error: Call to a member function hasResource() on a non-object in
/home/aykut/dev/kolonicms/application/modules/core/controllers/ErrorController.php
on line 49
Can somebody help me, please. Thank you
My guess is that you don't have a route for the URL /core/index/index
, and so ZF is redirecting to your error controller. Next, ErrorController.php
has a bug that causes it to call the hasResource()
method on a variable that doesn't hold an object or is null
. It will probably be easier to diagnose the issue if you fix the error controller first.
This is precisely why I built separate abstract test-case classes for controllers and views. I don't like that Zend's ControllerTestCase
tests the route, dispatcher, and views in addition to the controller.
If we could see the code in the dispatch()
method, it would be easier, but I can assume that there is probably an error that was triggered somewhere in the setUp()
(maybe in the bootstrap), swallowing the exception. After that it tried to call tearDown
and the attributes used in resetRequest()
(maybe $this->application
or $this->bootstrap
where never initialized in setup resulting in a PHP Error.
I posted an answer explaining when this kind or error can occur. I know its an old post, but if it can help someone else.
精彩评论