我有一个命令总线处理程序,它注入了一些服务:
class SomeHandler
{
private $service;
public function __construct(SomeService $service)
{
$this->service = $service;
}
public test(CommandTest $command)
{
$this->service->doSomeStuff();
}
}
在测试期间,我不想使用带有外部调用的 SomeService 的 doSomeStuff 方法。
class SomeService
{
private $someBindedVariable;
public function __construct($someBindedVariable)
{
$this->someBindedVariable = $someBindedVariable;
}
public function doSomeStuff()
{
//TODO: some stuff
}
}
在我尝试使用模拟对象替换服务的测试中存在这样的情况
public function testTest()
{
$someService = $this->getMockBuilder(SomeService::class)->getMock();
$this->getContainer()->set(SomeService::class, $someService);
//TODO: functional test for the route, which uses SomeHandler
}
第一个问题是这段代码会抛出异常"The "App\Service\SomeService" service is private, you cannot replace it."
好的,让我们尝试将其改为公共服务:
services.yaml:
App\Service\SomeService:
public: true
arguments:
$someBindedVariable: 200
但这并没有帮助。我从本地SomeService接收到响应。让我们尝试使用别名:
some_service:
class: App\Service\SomeService
public: true
arguments:
$someBindedVariable: 200
App\Service\SomeService:
alias: some_service
再次出现了模拟对象在测试中未被使用的情况。我从原生的SomeService中看到了响应。
我尝试添加自动装配选项,但并没有帮助。
在整个项目的测试中,我该如何将我的SomeService替换为某个模拟对象?