【发布时间】: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