我一直在用头撞墙试图弄清楚这一点。我正在尝试模拟私有服务属性,以便在测试期间不会调用它的方法。我一直无法在网上找到相关的解决方案。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会起作用,但不幸的是,这不是一个选择。感谢各位大侠的帮助,感激不尽!
1 回答
繁星淼淼
TA贡献1775条经验 获得超11个赞
好消息是您已经在使用依赖注入。这允许您轻松使用模拟/存根对象。请查看有关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());
}
}
- 1 回答
- 0 关注
- 152 浏览
添加回答
举报
0/150
提交
取消