我正在编写一个Zend框架应用程序,并正在使用PHPUnit进行测试。我的问题是,在我的开发和测试环境之间,有一小部分代码的重定向操作助手的行为不同。
代码如下:
if($user == NULL) {
$this->_logger->info('EMAIL NOT FOUND!');
$this->_flash->addMessage('User not found');
$this->_helper->redirector('index', 'index');
$this->_logger->info('SHOULD NEVER GET TO THIS LINE!');
}
当我在开发环境中的浏览器中运行它时,我得到以下日志条目:
2011-08-02T09:51:58+10:00 INFO (6): Controller: Myapplication_UserController
2011-08-02T09:51:58+10:00 INFO (6): EMAIL NOT FOUND!
2011-08-02T09:51:58+10:00 INFO (6): Controller: Myapplication_IndexController
2011-08-02T09:51:58+10:00 INFO (6): Service: Myapplication_Service_Authentication
完美。但是,当我的PHPUnit测试运行它时,我得到了这些日志条目:
2011-08-02T09:52:39+10:00 INFO (6): Controller: Myapplication_UserController
2011-08-02T09:52:39+10:00 INFO (6): EMAIL NOT FOUND!
2011-08-02T09:52:39+10:00 INFO (6): SHOULD NEVER GET TO THIS LINE!
2011-08-02T09:52:39+10:00 INFO (6): Controller: Myapplication_ErrorController
2011-08-02T09:52:39+10:00 INFO (6): Service: Myapplication_Service_Authentication
叽阿!为什么要执行重定向下面的行?
还有几点需要注意:
- 我有完全相同的行,
$this->_helper->redirector('index', 'index')
,在同一类和功能的其他地方,它在开发和测试环境中工作良好; - 我检查了htaccess, index.php, application.ini和bootstrap.php,并且可以发现两个环境之间的错误报告没有差异
- 我的测试类扩展Zend_Test_PHPUnit_ControllerTestCase
任何想法?感谢!
重定向帮助器有一个布尔成员call $_exit,它将告诉它是否在重定向被调用时退出。
在你的例子中,这个成员被设置为false并且重定向没有退出。
你正在使用的Zend_Test_PHPUnit_ControllerTestCase类将重定向器的$_exit成员设置为false。
这样做是为了在你进行单元测试时,重定向不会导致PHPUnit停止执行。如果不这样做,那么每次测试都会在中途停止运行。
这就是为什么你得到不需要的日志消息,因为重定向器没有退出。
请参阅标题部分此链接中的"控制器测试和重定向操作帮助器"