Zend框架:重定向在开发环境和测试环境之间的行为不同


Zend Framework: Redirector behaves differently between Dev and Test environments

我正在编写一个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停止执行。如果不这样做,那么每次测试都会在中途停止运行。

这就是为什么你得到不需要的日志消息,因为重定向器没有退出。

请参阅标题部分此链接中的"控制器测试和重定向操作帮助器"