тестирование с phpunit - PullRequest
0 голосов
/ 21 июля 2011

Я пытаюсь проверить свои контроллеры. Я следовал этому руководству:

http://www.zendcasts.com/unit-testing-a ... s / 2010/11 /

Все было хорошо, пока я не хотел использовать этот вызов в моей тестовой функции: $ This-> отправка ( '/'); Я думаю, проблема в начальной загрузке, но я не знаю, как решить эту проблему. Я вставляю свои файлы, участвующие в тестировании:

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->bootstrap = 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');
      }
}

А вот мой вывод phpunit:

$ 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

Может кто-нибудь помочь мне, пожалуйста. Спасибо

Ответы [ 2 ]

1 голос
/ 22 июля 2011

Я предполагаю, что у вас нет маршрута для URL /core/index/index, и поэтому ZF перенаправляет ваш контроллер ошибок.Затем, ErrorController.php имеет ошибку, которая заставляет его вызывать метод hasResource() для переменной, которая не содержит объект или имеет значение null.Вероятно, будет проще диагностировать проблему, если вы сначала исправите контроллер ошибок.

Именно поэтому я построил отдельные абстрактные классы тестовых случаев для контроллеров и представлений.Мне не нравится, что Zend ControllerTestCase тестирует маршрут, диспетчер и представления в дополнение к контроллеру.

0 голосов
/ 22 октября 2015

Если бы мы могли видеть код в методе dispatch(), это было бы проще, но я могу предположить, что, возможно, есть ошибка, которая была вызвана где-то в setUp() (возможно, в начальной загрузке), проглатывая исключение,После этого он попытался вызвать tearDown и атрибуты, использованные в resetRequest() (возможно, $this->application или $this->bootstrap, где никогда не инициализировались при установке, что приводило к ошибке PHP.

Я отправил ответ объяснение, когда может произойти этот вид или ошибка. Я знаю, что это старый пост, но может ли он помочь кому-то еще.

...