Jonny Barnes
Jonny Barnes

Reputation: 535

Mocking a GuzzleHttp response

How should I mock a Guzzle response properly. When testing a parser I'm writing, the test html is contained in files. In my PHPUnit tests I'm doing file_read_contents and passing the result into my method. Occasionally the HTML will link to a seperate file. I can mock this response like so:

public function testAlgo()
{
    $mock = new MockAdapter(function() {
        $mockhtml = file_get_contents($this->dir . '/HTML/authorship-test-cases/h-card_with_u-url_that_is_also_rel-me.html');
        $stream = Stream\create($mockhtml);

        return new Response(200, array(), $stream);
    });
    $html = file_get_contents($this->dir . '/HTML/authorship-test-cases/h-entry_with_rel-author_pointing_to_h-card_with_u-url_that_is_also_rel-me.html');
    $parser = new Parser();
    $parser->parse($html, $adaptor = $mock);

Then in my actual method, when I make the guzzle request this code works:

try {
    if($adapter) {
        $guzzle = new \GuzzleHttp\Client(['adapter' => $adapter]);
    } else {
        $guzzle = new \GuzzleHttp\Client();
    }
    $response = $guzzle->get($authorPage);

So obviously this isn't ideal. Does anyone know of a better way of doing this? $html = (string) $response->getBody();

EDIT: I'm now using the __construct() methid to set up a default Guzzle Client. Then a using a second function that can be called by tests to replace the Client with a new Client that has the mock adapter. I'm not sure if this is the best way to do things.

Upvotes: 1

Views: 3467

Answers (1)

Swader
Swader

Reputation: 11597

You can use the MockPlugin API, like so:

$plugin = new MockPlugin();
$plugin->addResponse(__DIR__.'/twitter_200_response.txt');

The txt file then contains everything from your response, including headers.

There are also good approaches available here: http://www.sitepoint.com/unit-testing-guzzlephp/

Also there are articles found here: http://guzzle3.readthedocs.io/testing/unit-testing.html

Upvotes: 1

Related Questions