解决您的问题的方法很少。
TestDoubleBundle
TestDoubleBundle可以更轻松地创建测试替身。您可以使用依赖注入标签自动将服务替换为存根或假服务。
覆盖容器
另一种方法是在测试环境中扩展容器,因此它允许存根。这是这个想法的草稿:
<?php
namespace Zalas\Test\DependencyInjection;
use Symfony\Component\DependencyInjection\Container;
class MockerContainer extends Container
{
/**
* @var object[] $stubs
*/
private $stubs = array();
public function stub($serviceId, $stub)
{
if (!$this->has($serviceId)) {
throw new \InvalidArgumentException(sprintf('Cannot stub a non-existent service: "%s"', $serviceId));
}
$this->stubs[$serviceId] = $stub;
}
/**
* @param string $id
* @param integer $invalidBehavior
*
* @return object
*/
public function get($id, $invalidBehavior = self::EXCEPTION_ON_INVALID_REFERENCE)
{
if (array_key_exists($id, $this->stubs)) {
return $this->stubs[$id];
}
return parent::get($id, $invalidBehavior);
}
/**
* @param string $id
*
* @return boolean
*/
public function has($id)
{
if (array_key_exists($id, $this->stubs)) {
return true;
}
return parent::has($id);
}
}
要启用此容器,您需要覆盖以下getContainerBaseClass
方法AppKernel
:
/**
* @return string
*/
protected function getContainerBaseClass()
{
if ('test' == $this->environment) {
return '\Zalas\Test\DependencyInjection\MockerContainer';
}
return parent::getContainerBaseClass();
}
您可能需要稍微调整代码,也许声明MockerContainer::$stubs
为静态(尽管如果您以前的方法有效,则不需要它 - 如果您需要为多个请求存根,则可能需要它)。
现在您应该能够使用容器来存根服务,如下所示:
$client->getContainer()->stub('my_service', $myServiceStub);
使用合成服务
解决您的问题的另一种方法是将您的服务定义为综合。您可以编写一个编译器通道,它只会在测试环境中将服务标记为合成服务。