dongliao1949 2019-08-13 12:39
浏览 103


I am performing functional tests with PHPUnit in a Symfony 4.3 project. All my test classes extend from TestCase.

I am having problems to stub the result of a method that makes a call to an external service. I don't want to check that this service works in my project functional tests, so I do the following:

public function testPutEndpoint()
    $stub = $this->createMock(ExternalRepository::class);
    $stub->method('put')->willReturn(['data'=> ['data']]);

        list($responseCode, $content) = $this->makeCurl(
           //Here a curl to the endpoint of my project is done

        $this->assertEquals(200, $responseCode);

Here I see how the code continues going throw the real method ignoring the sub.

So my question is, how can I stub a method that is inside the logic to test, but I cannot call it directly in the test class?

Also, the constructor of the endpoint receives the Repository as an injection:

protected $externalRepository;

public function __construct(ExternalRepository $externalRepository)
    $this->externalRepository = $externalRepository;
    $this->commandBus = $commandBus;
  • 写回答

1条回答 默认 最新

  • dongritan5654 2019-08-13 16:08

    At the moment the best solution I found to functional test the controller is:

    1. Mock the external repository class, and stub the put method.
    2. Create a Controller object and inject the stub
    3. Invoke the Controller with the test request
    4. Assert that the return of the controller matches what is expected

      public function testPut()
          $stub = $this->createMock(CatalogRepository::class);
          $stub->method('put')->willReturn([0 => 200, 1 => ['data' => 12355]]);
          $request = Request::create('/path', Request::METHOD_PUT, [], [], [], [], ['body']);
          $putController = new PutController($stub);
          $response = $putController->__invoke($request);
          $expectedResponse = 'expected response'
          $this->assertEquals($expectedResponse, $response);
    本回答被题主选为最佳回答 , 对您是否有帮助呢?



  • ¥15 时域内插或抽取、时频变换
  • ¥50 关于多次提交POST数据后,无法获取到POST数据参数的问题
  • ¥15 win10,这种情况怎么办
  • ¥15 如何在配置使用Prettier的VSCode中通过Better Align插件来对齐等式?(相关搜索:格式化)
  • ¥100 在连接内网VPN时,如何同时保持互联网连接
  • ¥15 MATLAB中使用parfor,矩阵Removal的有效索引在parfor循环中受限制
  • ¥20 Win 10 LTSC 1809版本如何无损提升到20H1版本
  • ¥50 win10 LTSC 虚拟键盘不弹出
  • ¥30 微信小程序请求失败,网页能正常带锁访问
  • ¥30 德飞莱51单片机实现C4炸弹