我一直在想办法解决这个问题。我正在尝试模拟私有服务属性,以便在测试期间不会调用该方法。
我一直无法在线找到相关的解决方案。
class MyClass
{
private $service
public function __construct($service) {
$this->service = $service;
}
public function myMethod()
{
$this->service->doStuff();
...do other stuff that I need to test...
}
}
在测试类中,我需要模拟$service
,以不调用doStuff()
use PHPUnit\Framework\TestCase;
class MyClassTest extends TestCase
{
public function setup()
{
...
}
public function testMyMethod()
{
$myClass = clone $this->app['MyClass'];
// Need to mock doStuff() here, so it is not called.
$myClass->service = $this->mockDoStuff();
//...test the other stuff in myMethod()...
}
}
我已经研究过RelfectionClasses,但不确定它们是否可以在这里为我提供帮助。
我知道将$service
更改为public
是可行的,但是不幸的是,这不是一种选择。
感谢您的帮助,谢谢!
答案 0 :(得分:0)
好消息是您已经在使用依赖项注入。这使您可以轻松使用模拟/存根对象。请查看有关stubbing的文档部分。总体思路是,您可以使用“存根”覆盖不需要运行的对象,以防止其执行常规操作。
类似以下的方法应该起作用:
class MyClassTest extends TestCase
{
public function setup()
{
...
}
public function testMyMethod()
{
// Method doStuff() will be overridden so that it does nothing and simply returns 'someValue'.
$stub = $this->createMock(MyService::class);
$stub->method('doStuff')->willReturn('someValue');
$myClass = new MyClass($stub->getMock());
}
}