ActiveResource::HttpMock
One thing that has always been a pain with remote web services is testing. The HttpMock class makes it easy to test your Active Resource models by creating a set of mock responses to specific requests.
To test your Active Resource model, you simply call the ActiveResource::HttpMock.respond_to method with an attached block. The block declares a set of URIs with expected input, and the output each request should return. The passed in block has any number of entries in the following generalized format:
mock.http_method(path, request_headers = {}, body = nil, status = 200, response_headers = {})
- http_method - The HTTP method to listen for. This can be get, post, put, delete or head.
- path - A string, starting with a "/", defining the URI that is expected to be called.
- request_headers - Headers that are expected along with the request. This argument uses a hash format, such as { "Content-Type" => "application/xml" }. This mock will only trigger if your tests sends a request with identical headers.
- body - The data to be returned. This should be a string of Active Resource parseable content, such as XML.
- status - The HTTP response code, as an integer, to return with the response.
- response_headers - Headers to be returned with the response. Uses the same hash format as request_headers listed above.
In order for a mock to deliver its content, the incoming request must match by the http_method, path and request_headers. If no match is found an InvalidRequestError exception will be raised letting you know you need to create a new mock for that request.
Example
def setup @matz = { :id => 1, :name => "Matz" }.to_xml(:root => "person") ActiveResource::HttpMock.respond_to do |mock| mock.post "/people.xml", {}, @matz, 201, "Location" => "/people/1.xml" mock.get "/people/1.xml", {}, @matz mock.put "/people/1.xml", {}, nil, 204 mock.delete "/people/1.xml", {}, nil, 200 end end def test_get_matz person = Person.find(1) assert_equal "Matz", person.name end
Files
- activeresource/lib/active_resource/http_mock.rb