【问题标题】:Create mocks in api functional testing with Symfony使用 Symfony 在 API 功能测试中创建模拟
【发布时间】:2020-04-11 20:44:54
【问题描述】:

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

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

我一直在考虑像创建模拟这样的东西,它总是在测试环境中使用,但我没有找到任何东西......

【问题讨论】:

    标签: api symfony mocking functional-testing


    【解决方案1】:

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

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

    【讨论】:

    • 问题是我没有测试外部 API。我想测试我目前正在开发的 API,但在功能测试中我正在对 API 执行实际请求,所以我不知道如何为我的 API 中调用的方法创建特定的模拟。
    • @Carles 如果您通过 client->request() 调用 API,那么您将无法模拟。您必须将其作为单元测试。
    【解决方案2】:

    您可以检查名为 url 的 http-client 服务,如果它比较您的外部 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",
                    }}'
                );
            }
        );
    

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

    【讨论】:

      猜你喜欢
      • 2020-08-19
      • 2021-03-28
      • 1970-01-01
      • 2013-11-12
      • 1970-01-01
      • 2015-10-21
      • 1970-01-01
      • 2021-02-06
      • 1970-01-01
      相关资源
      最近更新 更多