Fetching contributors…
Cannot retrieve contributors at this time
261 lines (151 sloc) 9.43 KB



  • The less hacky way to get the stream behaviour working for em-http-request. Thanks to Martyn Loughran

  • Fixed issues where Net::HTTP was not accepting valid nil response body. Thanks to Muness Alrubaie


  • Added support for em-http-request

  • Matching query params using a hash

       stub_http_request(:get, "").with(:query => {"a" => ["b", "c"]})
       RestClient.get("[]=b&a[]=c") # ===> Success
       request(:get, "").with(:query => {"a" => ["b", "c"]}).should have_been_made  # ===> Success
  • Matching request body against a hash. Body can be URL-Encoded, JSON or XML.

    (Thanks to Steve Tooke for the idea and a solution for url-encoded bodies)

      stub_http_request(:post, "").
      	with(:body => {:data => {:a => '1', :b => 'five'}})
 '', "data[a]=1&data[b]=five", 
    	:content_type => 'application/x-www-form-urlencoded')    # ===> Success
 '', '{"data":{"a":"1","b":"five"}}', 
    	:content_type => 'application/json')    # ===> Success
 '', '<data a="1" b="five" />', 
      	:content_type => 'application/xml' )    # ===> Success
      request(:post, "").
      with(:body => {:data => {:a => '1', :b => 'five'}},
       :headers => 'Content-Type' => 'application/json').should have_been_made	 # ===> Success
  • Request callbacks (Thanks to Myron Marston for all suggestions)

    WebMock can now invoke callbacks for stubbed or real requests:

      WebMock.after_request do |request_signature, response|
        puts "Request #{request_signature} was made and #{response} was returned"

    invoke callbacks for real requests only and except requests made with Patron client

      WebMock.after_request(:except => [:patron], :real_requests_only => true)  do |request_signature, response|
        puts "Request #{request_signature} was made and #{response} was returned"
  • to_raise() now accepts an exception instance or a string as argument in addition to an exception class

      stub_request(:any, '').to_raise("some error"))
      stub_request(:any, '').to_raise("some error")
  • Matching requests based on a URI is 30% faster

  • Fixed constant namespace issues in HTTPClient adapter. Thanks to Nathaniel Bibler for submitting a patch.


  • Fixed problem where ArgumentError was raised if query params were made up of an array e.g. data[]=a&data[]=b. Thanks to Steve Tooke


  • Changed license from GPL to MIT

  • Fixed gemspec file. Thanks to Razic


  • RSpec 2 compatibility. Thanks to Sam Phillips!

  • :allow_localhost => true' now permits as well as 'localhost'. Thanks to Mack Earnhardt

  • Request URI matching in now 2x faster!


  • VCR compatibility. Many thanks to Myron Marston for all suggestions.

  • Support for stubbing requests and returning responses with multiple headers with the same name. i.e multiple Accept headers.

      stub_http_request(:get, '').
        with(:headers => {'Accept' => ['image/png', 'image/jpeg']}).
        to_return(:body => 'abc')
       {"Accept" => ['image/png', 'image/jpeg']}) # ===> "abc\n"	
  • When real net connections are disabled and unstubbed request is made, WebMock throws WebMock::NetConnectNotAllowedError instead of assertion error or StandardError.

  • Added WebMock.version()


  • Added support for Patron

  • Responses dynamically evaluated from block (idea and implementation by Tom Ward)

      stub_request(:any, '').
           to_return { |request| {:body => request.body} }
 '', 'abc')    # ===> "abc\n"
  • Responses dynamically evaluated from lambda (idea and implementation by Tom Ward)

      stub_request(:any, '').
        to_return(lambda { |request| {:body => request.body} })
 '', 'abc')    # ===> "abc\n"	       
  • Response with custom status message

      stub_request(:any, "").to_return(:status => [500, "Internal Server Error"])
      req ="/")
      Net::HTTP.start("") { |http| http.request(req) }.message # ===> "Internal Server Error"
  • Raising timeout errors (suggested by Jeffrey Jones) (compatibility with Ruby 1.8.6 by Mack Earnhardt)

      stub_request(:any, '').to_timeout
 '', 'abc')    # ===> RestClient::RequestTimeout
  • External requests can be disabled while allowing localhost (idea and implementation by Mack Earnhardt)

      WebMock.disable_net_connect!(:allow_localhost => true)
      Net::HTTP.get('', '/')   # ===> Failure
      Net::HTTP.get('localhost:9887', '/')      # ===> Allowed. Perhaps to Selenium?

Bug fixes

  • Fixed issue where Net::HTTP adapter didn't work for requests with body responding to read (reported by Tekin Suleyman)
  • Fixed issue where request stub with headers declared as nil was matching requests with non empty headers


  • Fixed issue where response status code was not read from raw (curl -is) responses


  • Matching requests against provided block (by Sergio Gil)

      stub_request(:post, "").with { |request| request.body == "abc" }.to_return(:body => "def")'', 'abc')    # ===> "def\n"
      request(:post, "").with { |req| req.body == "abc" }.should have_been_made	
      assert_requested(:post, "") { |req| req.body == "abc" }
  • Matching request body against regular expressions (suggested by Ben Pickles)

      stub_request(:post, "").with(:body => /^.*world$/).to_return(:body => "abc")'', 'hello world')    # ===> "abc\n"
  • Matching request headers against regular expressions (suggested by Ben Pickles)

      stub_request(:post, "").with(:headers => {"Content-Type" => /image\/.+/}).to_return(:body => "abc")'', '', {'Content-Type' => 'image/png'})    # ===> "abc\n"
  • Replaying raw responses recorded with curl -is

      `curl -is > /tmp/example_curl_-is_output.txt`
      raw_response_file ="/tmp/example_curl_-is_output.txt")

    from file

      stub_request(:get, "").to_return(raw_response_file)

    or string

      stub_request(:get, "").to_return(
  • Multiple responses for repeated requests

      stub_request(:get, "").to_return({:body => "abc"}, {:body => "def"})
      Net::HTTP.get('', '/')    # ===> "abc\n"
      Net::HTTP.get('', '/')    # ===> "def\n"
  • Multiple responses using chained to_return() or to_raise() declarations

      stub_request(:get, "").
      	to_return({:body => "abc"}).then.  #then() just is a syntactic sugar
      	to_return({:body => "def"}).then.
      Net::HTTP.get('', '/')    # ===> "abc\n"
      Net::HTTP.get('', '/')    # ===> "def\n"
      Net::HTTP.get('', '/')    # ===> MyException raised
  • Specifying number of times given response should be returned

      stub_request(:get, "").
      	to_return({:body => "abc"}).times(2).then.
      	to_return({:body => "def"})
      Net::HTTP.get('', '/')    # ===> "abc\n"
      Net::HTTP.get('', '/')    # ===> "abc\n"
      Net::HTTP.get('', '/')    # ===> "def\n"
  • Added support for Net::HTTP::Post#body_stream

    This fixes compatibility with new versions of RestClient

  • WebMock doesn't suppress default request headers added by http clients anymore.

    i.e. Net::HTTP adds 'Accept'=>'*/*' to all requests by default


  • Fixed issue where WebMock was not closing IO object passed as response body after reading it.
  • Ruby 1.9.2 compat: Use File#expand_path for require path because "." is not be included in LOAD_PATH since Ruby 1.9.2


  • Fixed HTTPClient adapter compatibility with Ruby 1.8.6 (reported by Piotr Usewicz)
  • Net:HTTP adapter now handles request body assigned as Net::HTTP::Post#body attribute (fixed by Mack Earnhardt)
  • Fixed issue where requests were not matching stubs with Accept header set.(reported by Piotr Usewicz)
  • Fixed compatibility with Ruby 1.9.1, 1.9.2 and JRuby 1.3.1 (reported by Diego E. “Flameeyes” Pettenò)
  • Fixed issue with response body declared as IO object and multiple requests (reported by Niels Meersschaert)
  • Fixed "undefined method `assertion_failure'" error (reported by Nick Plante)


  • Support for HTTPClient (sync and async requests)
  • Support for dynamic responses. Response body and headers can be now declared as lambda. (Thanks to Ivan Vega ( @ivanyv ) for suggesting this feature)
  • Support for stubbing and expecting requests with empty body
  • Executing non-stubbed request leads to failed expectation instead of error

Bug fixes

  • Basic authentication now works correctly
  • Fixed problem where WebMock didn't call a block with the response when block was provided
  • Fixed problem where uris with single slash were not matching uris without path provided


  • Clarified documentation
  • Fixed some issues with loading of Webmock classes
  • Test::Unit and RSpec adapters have to be required separately


  • Added support for matching escaped and non escaped URLs