【问题标题】:Setting up a Controller Test with ZendFramework: Autoloader issue使用 ZendFramework 设置控制器测试:自动加载器问题
【发布时间】:2011-12-17 03:20:16
【问题描述】:

我正在使用 Zend Framework v1.11.0 开发 Web 应用程序,但我未能为控制器测试设置正确的测试环境。 我知道已经有很多关于设置 Zend 测试的问题,但是,经过数小时的研究,这些都没有解决我的问题。 所以这是我的代码:

测试引导:

<?php
error_reporting(E_ALL | E_STRICT);

defined('APPLICATION_PATH') || define('APPLICATION_PATH',realpath(dirname(__FILE__).'/../../application'));
define('APPLICATION_ENV', 'testing');
set_include_path(implode(PATH_SEPARATOR, array(realpath(APPLICATION_PATH.'/../library'), get_include_path())));

require_once ('Zend/Application.php');
require_once ('ControllerTestCase.php');

ControllerTestCase:

class ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase {

  public $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();
  }
}

简单测试:

class IndexControllerTest extends ControllerTestCase {
    public function testDefaultShouldInvokeIndexAction()
    {
        $this->dispatch('/');
        $this->assertModule('default');
        $this->assertController('index');
        $this->assertAction('index');
    }
}

每次我运行这个测试时,PHPUnit 都会抛出一个致命的错误消息,在我的库中找不到在我的 IndexController 中使用的类。因此,我认为原因一定与自动加载器有关。调试后我发现,测试通过常规 Bootstrap、Auth 插件等运行,并且我的库 包括在内。所以我不知道 PHPUnit 的问题可能是什么。在浏览器中一切正常,命令行中的非控制器测试(例如全局设置)也可以正常工作。

我将非常感谢任何提示我需要做什么才能让我的控制器测试正常工作!

编辑:我的目录结构是这样的(出于某些原因,我将我的类分成不同的库)

project
 - library1
 - library2
 - project_name
    ->application
    ->library3
    ->library4
    ->tests
       ->>application
          ->>>ControllerTestCase.php
          ->>>Bootstrap.php
       ->>Controller
          ->>>IndexControllerTest.php

我的包含路径实际上是这样的:

set_include_path(implode(PATH_SEPARATOR, array(realpath(APPLICATION_PATH.'/../library3'), get_include_path())));
set_include_path(implode(PATH_SEPARATOR, array(realpath(APPLICATION_PATH.'/../library4'), get_include_path())));
set_include_path(implode(PATH_SEPARATOR, array(realpath(APPLICATION_PATH.'/../../library1'), get_include_path())));
set_include_path(implode(PATH_SEPARATOR, array(realpath(APPLICATION_PATH.'/../../library2'), get_include_path())));

【问题讨论】:

    标签: php unit-testing zend-framework phpunit zend-test


    【解决方案1】:

    在我自己的ControllerTestCase 类中,我在构造函数中设置了引导对象,而不是setUp 函数。所以对你来说,这意味着改变这一点

    public function setUp() {
        $this->bootstrap = array($this, 'appBootstrap');
        parent::setUp();
    }
    

    进入

    public function __construct()
    {
        $this->bootstrap = new Zend_Application(
            APPLICATION_ENV,
            APPLICATION_PATH . '/configs/application.ini'
        );
    }
    

    并删除appBootstrap 方法。这确实是我在您的代码和我自己的代码之间看到的唯一区别。我没有解决问题,很可能您的路径设置已关闭。

    【讨论】:

    • 感谢您的回答!我尝试了此更改,但是出现了相同的错误。我会看看路径设置,但由于它在浏览器中工作,我非常确信它们是正确的。
    • 也许您可以发布您的目录结构的概述?用于您的库、应用程序和测试代码。
    • 您在问题中编辑的对 set_include_path() 的四个调用是否也在您的测试引导文件中执行?因为在您提供的代码示例中只有一个调用。
    • 是的,它们都包含在内,我只是缩短了代码以保持简单
    【解决方案2】:

    为 Zend 控制器正确设置测试用例的最简单方法是使用 zf 工具。通过使用它创建您的控制器,您可以为它们自动生成测试用例。

    zf create controller name index-action-included[=1] module
    

    它创建以下引导程序:

        defined('APPLICATION_PATH')
        || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
    
    defined('APPLICATION_ENV')
        || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'testing'));
    
    set_include_path(implode(PATH_SEPARATOR, array(
        realpath(APPLICATION_PATH . '/../library'),
        get_include_path(),
    )));
    
    require_once 'Zend/Loader/Autoloader.php';
    

    ...和控制器TestCase:

    class IndexControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
    {
    
        public function setUp()
        {
            $this->bootstrap = new Zend_Application(APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini');
            parent::setUp();
        }
    
        ....tests.........
    }
    

    您必须在引导程序中添加包含路径,并使用 spl_autoloader 注册任何自定义测试自动加载器。另外,记得用-c test/phpunit.xml启动phpunit

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      • 1970-01-01
      • 1970-01-01
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多