lunes, enero 30, 2012

Mock de web requests fácil

Hoy me surgió la necesidad de mockear el acceso web de una clase que realiza cierto scrapper (utilizo Nokogiri y open de la sig. manera;

doc = Nokogiri::HTML(open(URL))

Luego de buscar un poco e intentar sin éxito con la gema fakeweb encontré webmock que sí me anduvo.


Agrego la gema al Gemfile:

group :test do
  gem 'webmock'
end


Luego, en el setup de la clase a testear, configuro la url que voy a acceder con el resultado que deseo que traiga:


  def setup
    mock_file = Rails.root.join("test", "fixtures", "some_saved_website.html")

    stub_request(:get, /http:\/\/www.some_web.com\/*/).
      with(:headers => {'Accept'=>'*/*', 'User-Agent'=>'Ruby'}).
      to_return(:status => 200, :body => File.new(mock_file), :headers => {})
  end

Funciona muy bien. Hace mock de todos los requests y si falla algún otro acceso te escribe el código necesario para mockear el mismo:

  1) Error:
test_scrap_some_real_data(TestBlaBlaScrapper):
WebMock::NetConnectNotAllowedError: Real HTTP connections are disabled. Unregistered request: GET http://www.xxx.com/yyyy?o=2 with headers {'Accept'=>'*/*', 'User-Agent'=>'Ruby'}

You can stub this request with the following snippet:

stub_request(:get, "http://www.xxx.com/Internet/yyyy?o=2").
  with(:headers => {'Accept'=>'*/*', 'User-Agent'=>'Ruby'}).
  to_return(:status => 200, :body => "", :headers => {})