drci47425 2014-01-22 10:36 采纳率: 100%
浏览 33
已采纳

PHPUnit - 如何模拟/存根重定向方法?

I am working on a PHP Unit test where I need to test (while 100% code coverage is required) a class that implements it's own redirect($url, $code) method. This method calls exit; at the end to make sure no other code is executed after the redirect (and without this exit; the redirection is not done in the end...).

Now this redirect method is called in 7 different conditions which all have their own unit test case. If I run the unit tests while the exit; is present in the tested class, the unit tests are exited as well. Each of the test cases is testing something like:

$this->assertRedirect();
$this->assertResponseStatusCode(401);

Therefore I need to stub the redirect method so that it set's the Location header as well as the status code.

Here is what I am trying to do (using the redirect method's content except that exit; part - but it is not working obviously):

    $this->class = $this->getMockBuilder('Some\Name\Space\Class')
            ->disableOriginalConstructor()
            ->getMock();
    $this->class->expects($this->any())
            ->method('redirect')
            ->will($this->returnCallback(function () {
                $this->response->getHeaders()->addHeaderLine('Location: /');
                $this->response->setStatusCode(401);
                $this->response->sendHeaders();
            }));

and what I have tried before (and didn't work as well):

    $this->class = $this->getMockBuilder('Some\Name\Space\Class')
            ->disableOriginalConstructor()
            ->getMock();
    $this->class->expects($this->any())
            ->method('redirect')
            ->will($this->returnCallback(function () {
                header('Location: /');
            }));

Now the purpose of the class is to redirect somewhere in 90% of code coverage (only in one case - 2 lines out of 90 - it is not redirecting) so without the possibility to stub this redirect (and without possibility to test redirects at all) the test cases would not have almost any sense for this class (which is unwilling).

Any help is highly appreciated.

EDIT: Looks like phpunit/test_helpers could do the trick, but unfortunately, I am not able to install this extension to our preview and production environments where the tests are automatically run per each application deploy.

  • 写回答

1条回答 默认 最新

  • duangua5308 2014-01-22 13:44
    关注

    OK, I figured the problem out: because the application is an MVC architecture, the exit; called in during the dispatch was a bad approach.

    Instead of it, after the response headers are set correctly (in order to redirect) I am returning false all the way up until it is returned back to the dispatch process. In this case I do not need to call exit; anymore.

    Unit test for this case is running smoothly without any changes needed (it was implemented before the exit; call in the tested class).

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#linux#的问题(输入输出错误):出现这个界面接着我重新装系统,又让修电脑的师傅帮我扫描硬盘(没有问题)用着用着又卡死(相关搜索:固态硬盘)
  • ¥15 cv::resize不同线程时间不同
  • ¥15 web课程,怎么做啊😭没好好听课 根本不知道怎么下手
  • ¥15 做一个关于单片机的比较难的代码,然后搞一个PPT进行解释
  • ¥15 python提取.csv文件中的链接会经常出现爬取失败
  • ¥15 数据结构中的数组地址问题
  • ¥15 maya的mel里,怎样先选择模型A,然后利用mel脚本自动选择有相同名字的模型B呢。
  • ¥15 Python题,根本不会啊
  • ¥15 会会信号与系统和python的来
  • ¥15 关于#python#的问题