B Seven
B Seven

Reputation: 45943

How to mock requests made by the browser in a Rails app?

WebMock works fine for requests made by the app. But how to mock AJAX requests made by the browser to 3rd party services?

Rails 4.

Upvotes: 2

Views: 1107

Answers (2)

B Seven
B Seven

Reputation: 45943

Finally found 2 answers:

Approach #1: Puffing Billy

A rewriting web proxy for testing interactions between your browser and external sites.

Works like WebMock:

proxy.stub('http://www.google.com/')
  .and_return(:text => "I'm not Google!")

Approach #2: Rack Middleware

Although the previous approach can work, I discovered that it does not work with WebMock. So, if you want to mock your browser requests to external services, you can't mock your app requests.

The approach that worked for me is to run a separate Rack app and inject it into the middleware stack:

spec_helper.rb:

def test_app
  Rack::Builder.new{
    use ExternalServiceMock

    run app
  }.to_app
end

Capybara.app = test_app

ExternalServiceMock is a rack app that only responds to certain request paths.

For this particular app, all of the external service URI's were stored in configs, and I set them in the spec helper:

ENV[ 'EXTERNAL_SERVICE_URI' ] = 'http://localhost:3000'

This forces all external requests to be sent to the ExternalServiceMock.

Upvotes: 1

Juanito Fatas
Juanito Fatas

Reputation: 9959

So basically you only need to save the response from 3rd party services and stub the request, then you can test it! Also checkout VCR: https://github.com/vcr/vcr.

Upvotes: 0

Related Questions