
This is a port of the VCR 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 the php-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) – this project is not yet fully tested, so please use at your own risk!
Features
- Automatically records and replays your HTTP(s) interactions with minimal setup/configuration code.
 - Supports common http functions and extensions
- everyting using streamWrapper: fopen(), fread(), file_get_contents(), ... without any modification (except 
$http_response_headersee #96) - SoapClient by adding 
\VCR\VCR::turnOn();in yourtests/bootstrap.php - curl(), by adding 
\VCR\VCR::turnOn();in yourtests/bootstrap.php 
 - everyting using streamWrapper: 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 by setting the record mode
 - Request matching is configurable based on HTTP method, URI, host, path, body and headers, or you can easily
implement 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.
 
Usage example
Using static method calls:
class VCRTest extends \PHPUnit_Framework_TestCase
{
    public function testShouldInterceptStreamWrapper()
    {
        // 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();
    }
    public function testShouldThrowExceptionIfNoCasettePresent()
    {
        $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 exception
        file_get_contents('http://example.com');
    }
}
You can use annotations in PHPUnit by using phpunit-testlistener-vcr:
class VCRTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @vcr unittest_annotation_test
     */
    public function testInterceptsWithAnnotations()
    {
        // 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.
    }
}
Installation
Simply run the following command:
$ composer require --dev php-vcr/php-vcr
Dependencies
PHP-VCR depends on:
- PHP 5.3+
 - Curl extension
 - HTTP library Guzzle
 - symfony/yaml
 - beberlei/assert
 
Composer installs all dependencies except extensions like curl.
Run tests
In order to run all tests you need to get development dependencies using composer:
composer install
composer test
Changelog
The changelog has moved to the PHP-VCR releases page.
Copyright
Copyright (c) 2013-2016 Adrian Philipp. Released under the terms of the MIT license. See LICENSE for details.
Contributors

