微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 VCR-Listener 拦截 GuzzleHTTPClient 的困难

如何解决使用 VCR-Listener 拦截 GuzzleHTTPClient 的困难

我现在已经尝试了很多东西和教程,但我仍然无法使用 VCR-Listener 拦截我的 Guzzle 客户端。在我的 composer.json 中,我需要两个包。 (甚至将 VCR 移到 Guzzle 上方,以防万一):

{
    "autoload": {
      "psr-4": {
        "name\\Core\\": "./src","name\\Core\\tests\\" : "./tests"
      }
    },"name": "some/name","description": "","require-dev": {
    "PHPunit/PHPunit": "9.5.2.*","PHP-vcr/PHP-vcr": "1.5.2.*","PHP-vcr/PHPunit-testlistener-vcr": "3.2.1.*"
  },"require": {
    "ext-imagick": "*","guzzlehttp/guzzle": "7.3.*"
  }
}

然后在我的实现中,我使用了 Guzzle 客户端。我在方法中初始化它以确保在客户端初始化之前使用 VCR 进行测试,但是它没有帮助:

$client = new Client(['base_uri' => Self::BASE_URI]);
try {
            $url = "some valid relative uri";
            $response = $client->get($url);
            if($response->getStatusCode()==200) {
                $body = json_decode($response->getBody(),true);
                return new GenericModel(false,"Success",$body);
            } else {
                return new GenericModel(true,"Connection to API not possible");
            }
        } catch (GuzzleException $guzzleException) {
            return new GenericModel(true,$guzzleException->getMessage());
        }
}

要导入它,我使用普通语句 use GuzzleHttp\Client。 然后在我的 PHPunit.xml 中,我指定使用 vrc-listener 作为侦听器,并且还添加一个引导文件,因为其他一切都不起作用:

<?xml version="1.0" encoding="UTF-8"?>
<PHPunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         backupGlobals="false"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         bootstrap="tests/bootstrap.PHP"
         xsi:noNamespaceSchemaLocation="https://schema.PHPunit.de/9.3/PHPunit.xsd">
  <coverage>
    <include>
      <directory>./</directory>
    </include>
  </coverage>
  <testsuites>
    <testsuite name="Name Test Suite">
      <directory>./tests/</directory>
    </testsuite>
  </testsuites>
  <listeners>
    <listener class="VCR\PHPUnit\TestListener\VCRTestListener" file="vendor/PHP-vcr/PHPunit-testlistener-vcr/src/VCRTestListener.PHP" />
  </listeners>
</PHPunit>

我检查了侦听器和引导程序文件的路径,它们是正确的。 在我的测试中,我创建了一个测试,该测试应该使用 VCR 并在我调用 API 的方法拦截 Guzzle 客户端:

/**
     * @vcr weatherSpecificForecast.yml
     */
    public function testGetWeatherSpecificDay() {
         $this->core->getWeather(-3.05209,29.3696,Weekdays::SUNDAY);
         VCR::turnOff();
    }

由于仍然没有发生任何事情,我决定在引导程序中手动打开 VCR,并在测试用例结束时再次关闭它。引导程序:

<?PHP use VCR\VCR;

require_once __DIR__ . '/../../vendor/autoload.PHP';

VCR::configure()->setCassettePath('tests/fixtures');
VCR::configure()->setWhiteList(array('../vendor/guzzlehttp'));
VCR::turnOn();

然而,仍然没有任何反应。我以前从未写过引导程序,所以也许我错过了一些东西。 我开始测试,它进入方法。 guzzle 客户端也会调用 API 并接收响应。我什至得到状态代码 200 并且主体被转储到 GenericModel 而不是空的。 然而,它总是启动 API 调用,并且从来没有在 fixtures 文件夹中写入任何内容。我错过了什么吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。