- Notifications
You must be signed in to change notification settings - Fork206
Record your test suite's HTTP interactions and replay them during future test runs for fast, deterministic, accurate tests.
License
php-vcr/php-vcr
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
This is a port of theVCR Ruby library to PHP.
Record your test suite's HTTP interactions and replay them during future test runs for fast, deterministic, accurate tests. A bit of documentation can be found on thephp-vcr website.
Disclaimer: Doing this in PHP is not as easy as in programming languages which support monkey patching (I'm looking at you, Ruby)
- Automatically records and replays your HTTP(s) interactions with minimal setup/configuration code.
- Supports common http functions and extensions
- everything usingstreamWrapper: fopen(), fread(), file_get_contents(), ... without any modification (except
$http_response_header
see#96) - SoapClient by adding
\VCR\VCR::turnOn();
in yourtests/bootstrap.php
- curl(), by adding
\VCR\VCR::turnOn();
in yourtests/bootstrap.php
- everything usingstreamWrapper: fopen(), fread(), file_get_contents(), ... without any modification (except
- The same request can receive different responses in different tests -- just use different cassettes.
- Disables all HTTP requests that you don't explicitly allow bysetting the record mode
- Request matching is configurable based on HTTP method, URI, host, path, body and headers, or you can easilyimplement a custom request matcher to handle any need.
- The recorded requests and responses are stored on disk in a serialization format of your choice(currently YAML and JSON are built in, and you can easily implement your own custom serializer)
- Supports PHPUnit annotations.
Using static method calls:
class VCRTestextends TestCase{publicfunctiontestShouldInterceptStreamWrapper() {// After turning on the VCR will intercept all requests \VCR\VCR::turnOn();// Record requests and responses in cassette file 'example' \VCR\VCR::insertCassette('example');// Following request will be recorded once and replayed in future test runs$result =file_get_contents('http://example.com');$this->assertNotEmpty($result);// To stop recording requests, eject the cassette \VCR\VCR::eject();// Turn off VCR to stop intercepting requests \VCR\VCR::turnOff(); }publicfunctiontestShouldThrowExceptionIfNoCasettePresent() {$this->setExpectedException('BadMethodCallException',"Invalid http request. No cassette inserted. Please make sure to insert" ."a cassette in your unit test using VCR::insertCassette('name');" ); \VCR\VCR::turnOn();// If there is no cassette inserted, a request throws an exceptionfile_get_contents('http://example.com'); }}
You can use annotations in PHPUnit by usingphpunit-testlistener-vcr:
class VCRTestextends TestCase{/** * @vcr unittest_annotation_test */publicfunctiontestInterceptsWithAnnotations() {// Requests are intercepted and stored into tests/fixtures/unittest_annotation_test.$result =file_get_contents('http://google.com');$this->assertEquals('This is a annotation test dummy.',$result,'Call was not intercepted (using annotations).');// VCR is automatically turned on and off. }}
Simply run the following command:
$ composer require --dev php-vcr/php-vcr
PHP-VCR depends on:
- PHP 8
- Curl extension
- symfony/event-dispatcher
- symfony/yaml
- beberlei/assert
Composer installs all dependencies except extensions like curl.
In order to run all tests you need to get development dependencies using composer:
composer installcomposer test
The changelog has moved to thePHP-VCR releases page.
Copyright (c) 2013-2023 Adrian Philipp. Released under the terms of the MIT license. See LICENSE for details.Contributors
About
Record your test suite's HTTP interactions and replay them during future test runs for fast, deterministic, accurate tests.