模拟我的类私有服务属性

我一直在用头撞墙试图弄清楚这一点。我正在尝试模拟私有服务属性,以便在测试期间不会调用它的方法。


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


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会起作用,但不幸的是,这不是一个选择。感谢各位大侠的帮助,感激不尽!


犯罪嫌疑人X
浏览 153回答 1
1回答

繁星淼淼

好消息是您已经在使用依赖注入。这允许您轻松使用模拟/存根对象。请查看有关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());  }}
打开App,查看更多内容
随时随地看视频慕课网APP