【问题标题】:How do I mock an invokable in a ZF2 unit test?如何在 ZF2 单元测试中模拟可调用对象?
【发布时间】:2013-11-22 20:00:18
【问题描述】:

我正在尝试在具有使用视图助手的视图的控制器上运行单元测试。我的可调用对象是在我的助手配置中设置的:

<?php
return [
    'invokables' => [
        'viewHelper' => 'Theme\View\Helper\ViewHelper',
    ],
];

在我的单元测试中,我在 setUp() 中模拟了许多服务。

<?php

namespace Blargle\Controller;

class ActivityControllerTest extends AbstractZendHttpControllerTestCase
{
    /**
     * Someone set up us the bomb.
     */
    public function setUp()
    {
        parent::setUp();

        $mockActivityRepository = $this->getMock('Domain\Repository\Blargle\ActivityRepositoryInterface');
        $this->serviceManager->setService('Blargle\ActivityRepository', $mockActivityRepository);
    }

    /**
     * Test Add Action
     */
    public function testAddAction()
    {
        $this->createIdentity(); //Sets up the logged in user.

        $this->dispatch('/blargle/activity/add/1');
        $this->assertResponseStatusCode(200);

        $this->assertModuleName('blargle');
        $this->assertControllerName('Blargle\Controller\Activity');
        $this->assertControllerClass('ActivityController');
        $this->assertMatchedRouteName('blargle/activity');

        $mvcEvent = $this->getApplication()->getMvcEvent();
        $viewModel = $mvcEvent->getResult();

        $this->assertInstanceOf('Zend\View\Model\ViewModel', $viewModel);
        $this->assertEquals($viewModel->getTemplate(), 'blargle/activity/add');
    }
}

所以,我现在需要模拟视图加载的可调用对象,但视图所依赖的服务管理器与视图相关联。我试过了:

$mockHelper = $this->getMock('Theme\View\Helper\ViewHelper');
$this->serviceManager->setService('viewHelper', $mockHelper);

这是徒劳的,因为它现在存在于控制器服务管理器中,而对等点似乎是由视图产生的。不幸的是,该视图在它出去之前创建了一个新的服务实例,并在它的对等点中寻找一个实例。

那么,关于如何有效地模拟这个有什么想法吗?

【问题讨论】:

  • 你可以模拟一个服务管理器来返回一个模拟服务,然后在你的对象上调用 setServiceManager($your_mock_service_manager) ?

标签: unit-testing zend-framework2 phpunit


【解决方案1】:

请务必在发送您的请求之前模拟帮助程序 :)

public function testMethod()
{
    /**
      * mock of your invokable class
      */
    $mock = ...;

    $sm = $this->getApplicationServiceLocator();
    $sm->setAllowOverride(true);
    $sm->setService('viewHelper', $mock);
    $sm->setAllowOverride(false);

    // your invokable is now mocked
}

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 2018-08-31
    相关资源
    最近更新 更多