0

我想在 Zend Framework 3 中测试一个特定的控制器操作。因为我使用ZfcUserhttps://github.com/ZF-Commons/ZfcUser)和Bjyauthorizehttps://github.com/bjyoungblood/BjyAuthorize)我需要模拟一些查看助手。例如,我需要模拟isAllowed视图助手并让它始终返回 true:

class MyTest extends AbstractControllerTestCase
{
    public function setUp()
    {
        $this->setApplicationConfig(include 'config/application.config.php');
        $bootstrap      = \Zend\Mvc\Application::init(include 'config/application.config.php');
        $serviceManager = $bootstrap->getServiceManager();

        $viewHelperManager = $serviceManager->get('ViewHelperManager');

        $mock = $this->getMockBuilder(IsAllowed::class)->disableOriginalConstructor()->getMock();
        $mock->expects($this->any())->method('__invoke')->willReturn(true);

        $viewHelperManager->setService('isAllowed', $mock);

        $this->getApplication()->getServiceManager()->setAllowOverride(true);
        $this->getApplication()->getServiceManager()->setService('ViewHelperManager', $viewHelperManager);
    }

    public function testViewAction()
    {
        $this->dispatch('/myuri');
        $resp = $this->getResponse();
        $this->assertResponseStatusCode(200);
        #$this->assertModuleName('MyModule');
        #$this->assertMatchedRouteName('mymodule/view');
    }
}

在我的view.phtml(将通过打开/调度/myuriuri 呈现)中,我调用 view helper $this->isAllowed('my-resource')

但是我在执行时收到了响应代码 500 并出现异常失败testViewAction()

Exceptions raised:
Exception 'Zend\ServiceManager\Exception\ServiceNotFoundException' with message 'A plugin by the name "isAllowed" was not found in the plugin manager Zend\View\HelperPluginManager' in ../vendor/zendframework/zend-servicemanager/src/AbstractPluginManager.php:131

我怎样才能以某种方式将我的isAllowed模拟注入视图助手管理器,让测试用例(testViewAction/ $this->dispatch())通过。

4

2 回答 2

1

如上一个答案所述,我们需要ViewHelperManager在应用程序对象中覆盖 ViewHelper。以下代码显示了如何实现这一点:

public function setUp()
{
    $this->setApplicationConfig(include 'config/application.config.php');
    $bootstrap = \Zend\Mvc\Application::init(include 'config/application.config.php');
    $serviceManager = $bootstrap->getServiceManager();

    // mock isAllowed View Helper of Bjyauthorize
    $mock = $this->getMockBuilder(IsAllowed::class)->disableOriginalConstructor()->getMock();
    $mock->expects($this->any())->method('__invoke')->willReturn(true);

    // inject the mock into the ViewHelperManager of the application
    $this->getApplication()->getServiceManager()->get('ViewHelperManager')->setAllowOverride(true);
    $this->getApplication()->getServiceManager()->get('ViewHelperManager')->setService('isAllowed', $mock);
}
于 2018-03-07T14:06:09.023 回答
0

ViewHelperManager 是服务管理器的另一个实例。并且不允许覆盖源代码。您可以在“setService”方法之前尝试“setAllowOverride”吗?

于 2018-01-20T14:22:23.180 回答