问题描述
我现在已经尝试了很多东西和教程,但我仍然无法使用 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 (将#修改为@)