1

これまでのところ、次のように 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 で正しく機能していることをテストするにはどうすればよいですか?

4

2 に答える 2

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\AbstractHttpControllerTestCaseassertQuery($path)他のWeb関連のメソッドと同様にこれを使用します。

于 2013-03-06T02:20:30.153 に答える
-1

編集:私がこれに自己回答して以来、ZF2が更新されました。PowerKiki の答えの方が優れています。

于 2012-10-10T03:48:17.060 に答える