我正在使用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中使用的库中找到一个类。因此,我认为原因必须是与Autoloader相关的东西。调试后我发现,测试通过常规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())));
答案 0 :(得分: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
方法。这是我在代码和我自己的代码之间看到的唯一区别。我没有解决问题,可能是您的路径设置已关闭。
答案 1 :(得分:0)
为Zend Controller正确设置测试用例的最简单方法是使用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';
...和controllerTestCase:
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