Ruby on rails 如何在Rails应用程序中模拟浏览器发出的请求?

Ruby on rails 如何在Rails应用程序中模拟浏览器发出的请求?,ruby-on-rails,ruby-on-rails-4,rspec,Ruby On Rails,Ruby On Rails 4,Rspec,WebMock可以很好地处理应用程序发出的请求。但是如何模拟浏览器向第三方服务发出的AJAX请求呢 Rails 4.因此基本上您只需要保存来自第三方服务的响应并存根请求,然后就可以测试它了!同时检查VCR:。最终找到了两个答案: 方法1: 重写web代理,用于测试浏览器和外部站点之间的交互 类似于WebMock: proxy.stub('http://www.google.com/') .and_return(:text => "I'm not Google!") 方法2:机架中间件

WebMock可以很好地处理应用程序发出的请求。但是如何模拟浏览器向第三方服务发出的AJAX请求呢


Rails 4.

因此基本上您只需要保存来自第三方服务的响应并存根请求,然后就可以测试它了!同时检查VCR:。

最终找到了两个答案:

方法1: 重写web代理,用于测试浏览器和外部站点之间的交互

类似于WebMock:

proxy.stub('http://www.google.com/')
  .and_return(:text => "I'm not Google!")
方法2:机架中间件 虽然前面的方法可以工作,但我发现它不适用于WebMock。因此,如果你想模拟你对外部服务的浏览器请求,你不能模拟你的应用请求

对我有效的方法是运行一个单独的Rack应用程序并将其注入中间件堆栈:

spec_helper.rb:

def test_app
  Rack::Builder.new{
    use ExternalServiceMock

    run app
  }.to_app
end

Capybara.app = test_app
ExternalServiceMock是一个机架应用程序,它只响应特定的请求路径

对于这个特定的应用程序,所有外部服务URI都存储在configs中,我在spec helper中设置它们:

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

这将强制将所有外部请求发送到ExternalServiceMock。

但请求url可能是外部的,不在您的控制范围内。测试环境中的所有内容都在我的控制范围内。