Zend Framework 2如何使用phpunit在控制器中测试前进?

时间:2014-06-02 13:41:04

标签: php unit-testing zend-framework phpunit forward

如何使用PHPUnit在控制器中测试转发?

我有两个简单的模块(A和B),模块A使用前向调用模块B. 这是一个不起作用的简单代码:

ModuleA

class ModuleAController extends AbstractRestfulController 
{              
protected $em;

 public function setEntityManager(EntityManager $em)
    {
        $this->em = $em;
    }

public function getEntityManager()
{
    if (null === $this->em) {
        $this->em 
        $this->getServiceLocator()->get('doctrine.entitymanager.orm_default');
    }
    return $this->em;
}

 public function getList()
{  
    $data = array('message' => 'passed by module A');

    $forward = $this->forward()->dispatch('ModuleB\Controller\ModuleB');

    $data['Message'] = $forward->getVariable('Message');
    return new JsonModel($data);
}

}

ModuleB

class ModuleBController extends AbstractRestfulController 
{

 public function setEntityManager(EntityManager $em)
    {
        $this->em = $em;
    }

 public function getEntityManager()
 {
    if (null === $this->em) {
        $this->em = $this->getServiceLocator()->get('doctrine.entitymanager.orm_default');
    }

 }
  public function getList()
 {
    $data = array('Message'=>'passed by module B');
    return new JsonModel($data);
 }
}

这是一个测试代码:

class ModuleAControllerTest extends AbstractHttpControllerTestCase
{
    protected $controller;
    protected $request;
    protected $response;
    protected $routeMatch;
    protected $event;

    protected function setUp()
    {
        $serviceManager = Bootstrap::getServiceManager();
        $this->controller = new ModuleAController();
        $this->request    = new Request();
        $this->routeMatch = new RouteMatch(array());
        $this->event      = new MvcEvent();
        $config = $serviceManager->get('Config');
        $routerConfig = isset($config['router']) ? $config['router'] : array();
        $router = HttpRouter::factory($routerConfig);

        $this->event->setRouter($router);
        $this->event->setRouteMatch($this->routeMatch);
        $this->controller->setEvent($this->event);
        $this->controller->setServiceLocator($serviceManager);
    }
    public function testModuleAControllerCanBeAccessed()
    {        

        $result   = $this->controller->dispatch($this->request);
        $response = $this->controller->getResponse();

        $this->assertEquals(200, $response->getStatusCode());
        $this->assertEquals(200, 1+99+100);
    }
}

这是错误消息: 有1个错误:

1) ModuleATest\Controller\ModuleAControllerTest::testModuleAControllerCanBeAccessed
Zend\ServiceManager\Exception\ServiceNotCreatedException: An exception was raised while creating "forward"; no instance returned
....
Caused by
Zend\ServiceManager\Exception\ServiceNotCreatedException: Zend\Mvc\Controller\Plugin\Service\ForwardFactory requires that the application service manager has been injected; none found
....

FAILURES!
Tests: 1, Assertions: 0, Errors: 1.

有没有办法让这段代码工作?任何想法??

谢谢。

1 个答案:

答案 0 :(得分:0)

我还没有为插件创建模拟。我不知道如何设置新的插件到控制器。但是模拟会像它一样。

PHPunit测试文件

public function testControllerWithMock()
{
    /* Result from ModuleBController method getList() */
    $forwardResult = new JsonModel(array('Message'=>'passed by module B'));

    /* Create mock object for forward plugin */
    $forwardPluginMock = $this->getMockBuilder('\Zend\Mvc\Controller\Plugin\Forward')
        ->disableOriginalConstructor()
        ->getMock();
    $forwardPluginMock->expects($this->once())
        ->method('dispatch') /* Replace method dispatch in forward plugin */
        ->will($this->returnValue($forwardResult)); /* Dispatch method will return $forwardResult */

    /* Need register new plugin (made mock object) */
    $controller->setPluginManager(); /* ??? Set new plugin to controller */

我在考虑如何决定。

好的,试试吧。

    $controller->getPluginManager()->injectController($forwardPluginMock);

我没有为控制器编写PHPUnit测试。因为控制器必须使用Selenium返回视图和最佳解决方案来测试视图。我通常使用PHPUnitSelenium测试来测试它。