开发者

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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜