【问题标题】:How to test a forwarded request with PHPUnit in Zend Framework 2?如何在 Zend Framework 2 中使用 PHPUnit 测试转发的请求?
【发布时间】:2013-03-08 22:22:56
【问题描述】:

我有一个简单的控制器动作

class CatalogController extends AbstractActionController {

    public function indexAction() {
        return new ViewModel();
    }
    // ...
}

并对其进行单元测试:

class CatalogControllerTest extends AbstractHttpControllerTestCase
{
    public function testIndexActionCanBeAccessed()
    {
        $this->routeMatch->setParam('action', 'index');
        $result   = $this->controller->dispatch($this->request);
        $response = $this->controller->getResponse();
        $this->assertEquals(200, $response->getStatusCode());
        $this->assertInstanceOf('Zend\View\Model\ViewModel', $result);
}

效果很好。

现在我是forwarding 请求

public function indexAction() {
    return $this->forward()->dispatch('Catalog/Controller/Catalog', array('action' => 'list-cities'));
}

$this->controller->dispatch($this->request); 之后通过单元测试得到错误:

PHP Fatal error:  Call to a member function getEventManager() on a non-object in /var/www/path/to/project/vendor/zendframework/zendframework/library/Zend/Mvc/Controller/Plugin/Forward.php on line 147

您如何/应该如何使用转发测试操作方法?

谢谢

【问题讨论】:

    标签: unit-testing phpunit zend-framework2 forwarding controller-action


    【解决方案1】:

    你试过这样调度吗?我刚刚尝试在我的一个控制器操作中转发,并且单元测试工作正常。这是我的代码:

    use Zend\Test\PHPUnit\Controller\AbstractHttpControllerTestCase
    
    class IndexControllerTest extends AbstractHttpControllerTestCase
    {
    
        public function setUp()
        {
            require APPLICATION_PATH . '/init_autoloader.php';
            $testConfig = include APPLICATION_PATH . '/config/test.php';
            $this->setApplicationConfig($testConfig);
            parent::setUp();
        }
    
        public function testFoo()
        {
            $this->dispatch('/catalogue');
            $this->assertResponseStatusCode(200);
            $this->assertModuleName('Catalogue');
            $this->assertControllerName('Catalogue\Controller\Index');
            $this->assertControllerClass('IndexController');
            $this->assertActionName('index');
            $this->assertMatchedRouteName('logcataloguen');
        }
    
    }
    

    【讨论】:

    • 感谢您的回答,但它是 ZF2,而不是 ZF1。没有APPLICATION_PATH_dispatch(...) 了,新的dispatch(...) 方法的第一个参数需要是Request 对象(must implement interface Zend\Stdlib\RequestInterface)。
    • 编辑:我试过的是$this->controller->dispatch('/index');。它实际上不能工作,因为AbstractController#dispatch(...) 需要一个Request 对象。现在我尝试了$this->dispatch('/index'); 并且它有效。谢谢!
    • 是的,我知道它是 ZF2,我发布的代码来自我的 ZF2 应用程序之一。我刚刚打错字了。它应该是->dispath,而不是->_dispatch。不,新调度的第一个参数不需要是请求对象。见这里:framework.zend.com/manual/2.1/en/modules/zend.test.phpunit.html
    猜你喜欢
    • 2014-07-22
    • 1970-01-01
    • 2012-10-30
    • 2015-07-26
    • 2012-11-18
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 2013-07-04
    相关资源
    最近更新 更多