为了账号安全,请及时绑定邮箱和手机立即绑定

模拟我的类私有服务属性

模拟我的类私有服务属性

PHP
犯罪嫌疑人X 2021-12-03 15:01:12
我一直在用头撞墙试图弄清楚这一点。我正在尝试模拟私有服务属性,以便在测试期间不会调用它的方法。我一直无法在网上找到相关的解决方案。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());

  }

}


查看完整回答
反对 回复 2021-12-03
  • 1 回答
  • 0 关注
  • 152 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信