有解決你的問題的一些方法。
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);
使用綜合服務
在你的問題的工作是定義你的服務爲synthetic的另一種方式。您可以編寫一個編譯器通行證,僅在測試環境中將服務標記爲綜合。
謝謝你的回覆。我已經看到了這個討論,並且我看到我的項目採用了同樣的方式[xkobal](https://github.com/symfony/symfony/pull/21533#issuecomment-302105140) 另外,我不想要我的測試作爲遺產,它必須工作。在討論中沒有真正的解決方案,只是「這是正常的」,「傳統」,「現在不需要」...... –