使用Symfony在api功能测试中创建模拟

时间:2019-12-19 09:20:45

标签: api symfony mocking functional-testing

我正在处理Symfony 4 API功能测试中遇到的问题。我的功能测试包括向API发出请求并分析给出的响应。我一直在这样工作,并且工作正常。

问题与我正在实现的新API方法有关,该方法需要执行对外部服务的请求。我想在测试期间进行模拟,但是我不知道如何创建当API接收到功能测试发出的请求时仍然存在的模拟。

我一直在思考诸如创建模拟之类的东西,这些东西总是在测试环境中使用,但是我什么也没发现...

2 个答案:

答案 0 :(得分:0)

我不确定我是否理解正确,但是如果您想模拟一个外部API(这意味着您的应用程序正在连接到另一台服务器上的另一个应用程序),一种解决方案是实际在模拟服务器上吃午餐以替换您实际的外部服务器。

您可以自己实现这样的模拟服务器,也可以使用现有的解决方案,例如http://wiremock.org/

答案 1 :(得分:0)

您可以签入名为url的http客户端服务,如果它与您的外部api url比较返回某些响应,则将类似于以下内容:

$guzzleServiceMock = $this
->getMockBuilder(GuzzleHttp\Client::class)->disableOriginalConstructor()
->setMethods(['get'])
->getMock();

$guzzleServiceMock
    ->expects($this->any())
    ->method('get')
    ->with(
        $this->stringContains('/external/api/route')
    )
    ->willReturnCallback(
        function ($uri, $options = []) {
            return new Response(
                200,
                [],
                '{"result": {
                    "status": "success",
                    "data": "fake data",
                }}'
            );
        }
    );

下一步,您需要将服务注入到容器中,有了这个问题,您可以查看此存储库,其中有很好的示例说明了如何做到这一点:https://github.com/peakle/symfony-4-service-mock-examples/blob/master/tests/Util/BaseServiceTest.php