php-vcr/php-vcr

Record your test suite's HTTP interactions and replay them during future test runs for fast, deterministic, accurate tests.

Installs: 27 323

Dependents: 20

Stars: 290

Watches: 20

Forks: 31

Open Issues: 25

Language: PHP

1.2.5 2015-06-19 17:33 UTC

README

PHP-VCR

Build Status Dependency Status Code Coverage Scrutinizer Quality Score

This is a port of VCR for ruby.

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!

  • 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_header see #96)
    • SoapClient by adding \VCR\VCR\turnOn(); in your tests/boostrap.php
    • curl(), by adding \VCR\VCR::turnOn(); in your tests/boostrap.php
  • 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:

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 --dev
phpunit ./tests

Changelog

The changelog has moved to the PHP-VCR releases page.

Old changelog entries:

  • 2014-10-23 Release 1.1.6: #73, #74, #75, improvements for JSON storage and binary requests.
  • 2014-09-11 Release 1.1.5: Fixes #58 #60, #61, #69 updated vendors and new record mode.
  • 2014-04-26 Release 1.1.4: Fixes #50, #52, #53, #54, #56 and better error messages.
  • 2014-04-12 Release 1.1.3: Fixes #48: Allows data to be passed to CURLOPT_POSTFIELDS.
  • 2014-02-27 Release 1.1.2: Fix for storing the request body.
  • 2014-02-27 Release 1.1.1: Fix for non-GET requests with Guzzle.
  • 2014-02-22 Release 1.1.0: Removes curl runkit library hook and additional cleanup.
  • 2014-02-19 Release 1.0.7: Adds query request matcher.
  • 2014-01-12 Release 1.0.6: Updates dependencies.
  • 2013-10-13 Release 1.0.5: Fixed SOAP support, refactorings.
  • 2013-07-22 Release 1.0.4: Updates dependencies.
  • 2013-06-05 Release 1.0.3: Added curl_rewrite (in addition to curl_runkit) to overwrite curl functions.
  • 2013-05-15 Release 1.0.0
  • 2013-05-15 Adds PHPUnit annotations using phpunit-testlistener-vcr
  • 2013-05-14 Easier API (static method calls)
  • 2013-02-22 Added YAML support
  • 2013-02-21 Added custom request matcher
  • 2013-02-21 Added JSON storage which uses less memory
  • 2013-02-21 Added support for binary data
  • 2013-02-20 Added Soap support
  • 2013-02-19 Curl hook fixes, more tests
  • 2013-02-18 First prototype

Copyright

Copyright (c) 2013 Adrian Philipp. Released under the terms of the MIT license. See LICENSE for details.