The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Test::Mock::LWP::Dispatch - mocks LWP::UserAgent and dispatches your requests/responses

VERSION

version 0.06

SYNOPSIS

  # in your *.t
  use Test::Mock::LWP::Dispatch;
  use HTTP::Response;

  # global mappings for requests and responses for LWP::UserAgent
  $mock_ua->map('http://example.com', HTTP::Response->new(...));
  # or
  $mock_ua->map(qr!^http://example.com/page!, sub { my $request = shift;
                                                    # ... create $response
                                                    return $response; });

  # or make local mappings
  my $ua = LWP::UserAgent->new;
  $ua->map(...);

DESCRIPTION

This module intends for testing a code that heavily uses LWP::UserAgent.

Assume that function you want to test makes three different request to the server and expects to get some content from the server. To test this function you should setup request/response mappings for mocked UserAgent and test it.

For doing something with mappings, here are methods map, unmap and unmap_all. For controlling context of these mappings (is it applies for all created in your code LWP::UserAgent's or only to one specific?) you should call these functions for exported $mock_ua object (global mapping) or for newly created LWP::UserAgent (local mappings).

See also on Test::Mock::LWP, it provides mocked LWP objects for you, so probably you can solve your problems with this module too.

METHODS

simple_request($req)

This is only method of LWP::UserAgent that mocked. When you make $ua->get(...) or $ua->head(...) or just get() from LWP::Simple, at some point calls simple_request() method. So for controlling responses to your requests it is only method needed to mock.

In this module simple_request() loops through your local and global mappings (in this order) and returns response on a first matched mapping. If no matched simple_request() returns HTTP::Response with 404 code.

Be accurate: method loops through mappings in order of adding these mappings.

map($req_descr, $resp_descr)

Using this method you can say what response should be on what request.

If you call this method for exported $mock_ua it will make global mappings applied for all newly created LWP::UserAgent's. If you call this method for separate LWP::UserAgent you created, then this mapping will work only for this object.

Request description $req_descr can be:

string

Uri for exact matching with incoming request uri in request().

regexp

Regexp on what incoming request uri will match.

code

You can pass arbitrary coderef, that takes incoming HTTP::Request and returns true if this request matched.

HTTP::Request object

If you pass such object, then request will compare that incoming request exactly the same that you passed in map() (this means, that all query parameters, all headers and so on must be identical).

Response description $resp_descr, that will be returned if incoming request to request() matches with $req_descr, can be:

HTTP::Response object

Ready to return HTTP::Response object.

code

Arbitrary coderef, that takes incoming request as parameter and returns HTTP::Response object.

Method returns index of your mapping. You can use it in unmap.

unmap($map_index)

Deletes some mapping by index.

unmap_all

Deletes all mappings.

SWITCHES

DEFAULT_REQUEST_HEADERS

LWP::UserAgent sets default headers for requests by calling LWP::UserAgent->prepare_request().

Previous versions (<= 0.05) of Test:Mock::LWP::Dispatch didn't intercept this call in overridden simple_request().

Now Test::Mock::LWP::Dispatch does it by default.

If for some reason you want to get back previous behaviour of the module, set the following variable off:

$Test::Mock::LWP::Dispatch::DEFAULT_REQUEST_HEADERS = 0;

MISCELLANEOUS

This mock object doesn't call fake_new(). So when you prepare response using coderef, you can be sure, that "User-Agent" header will be untouched and so on.

ACKNOWLEDGEMENTS

Mike Doherty

Andreas König

Ash Berlin

Joe Papperello

SEE ALSO

http://github.com/tadam/Test-Mock-LWP-Dispatch

Test::Mock::LWP

LWP::UserAgent

AUTHOR

Yury Zavarin <yury.zavarin@gmail.com>

COPYRIGHT AND LICENSE

This software is copyright (c) 2013 by Yury Zavarin.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.

1 POD Error

The following errors were encountered while parsing the POD:

Around line 284:

Non-ASCII character seen before =encoding in 'König'. Assuming UTF-8