模拟我的班级私人服务财产

时间:2019-08-22 17:26:02

标签: php phpunit

我一直在想办法解决这个问题。我正在尝试模拟私有服务属性,以便在测试期间不会调用该方法。

我一直无法在线找到相关的解决方案。

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 个答案:

答案 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());
  }
}