ZF2 / ZF2中的路由测试相当于Zend_Test_PHPUnit_Controller_TestCase?

时间:2012-10-08 14:19:06

标签: php unit-testing routes phpunit zend-framework2

到目前为止,我一直在测试我的ZF2控制器如下:

namespace Application\Controller;

use Application\Controller\IndexController;
use Zend\Http\Request;
use Zend\Http\Response;
use Zend\Mvc\MvcEvent;
use Zend\Mvc\Router\RouteMatch;
use PHPUnit_Framework_TestCase;

class IndexControllerTest extends PHPUnit_Framework_TestCase
{
    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);
    }

    protected function setUp()
    {
        \Zend\Mvc\Application::init(include 'config/application.config.php');

        $this->controller = new IndexController();
        $this->request    = new Request();
        $this->routeMatch = new RouteMatch(array('controller' => 'index'));
        $this->event      = new MvcEvent();
        $this->event->setRouteMatch($this->routeMatch);
        $this->controller->setEvent($this->event);
    }

    protected $controller = null;
    protected $event = null;
    protected $request = null;
    protected $response = null;
    protected $routeMatch = null;
}

这允许我测试ViewModel在呈现视图之前是否具有分配给它的正确数据(如果有)。这样做很好,但它没有做的是测试我的路由是否正常工作,就像ZF1 Zend_Test_PHPUnit_Controller_TestCase测试一样。

在这些中,我会通过运行$this->dispatch('/some/relative/url')来启动测试,只有在路由设置正确的情况下才能获得正测试结果。通过这些ZF2测试,我特别告诉它使用哪条路由,这并不一定意味着真正的请求将被正确路由。

如何在ZF2中测试我的路由是否正常工作?

2 个答案:

答案 0 :(得分:5)

我迟到了,但它对新手来说仍然有用。现在的解决方案是继承\Zend\Test\PHPUnit\Controller\AbstractControllerTestCase,因此用法与ZF1非常相似:

class IndexControllerTest extends \Zend\Test\PHPUnit\Controller\AbstractHttpControllerTestCase
{
    public function setUp()
    {
        $this->setApplicationConfig(
                include __DIR__ . '/../../../../../config/application.config.php'
        );
        parent::setUp();
    }

    public function testIndexActionCanBeAccessed()
    {
        $this->dispatch('/');

        $this->assertResponseStatusCode(200);
        $this->assertModuleName('application');
        $this->assertControllerName('application\controller\index');
        $this->assertControllerClass('IndexController');
        $this->assertMatchedRouteName('home');

        $this->assertQuery('html > head');
    }
}

注意:这会使用\Zend\Test\PHPUnit\Controller\AbstractHttpControllerTestCase,其中包含assertQuery($path)以及其他与网络相关的方法。

答案 1 :(得分:-1)

编辑: ZF2已经更新,因为我自己回答了这个问题。 PowerKiki's answer更好。