Ruby on rails 如何在Rails应用程序中模拟浏览器发出的请求?
WebMock可以很好地处理应用程序发出的请求。但是如何模拟浏览器向第三方服务发出的AJAX请求呢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:机架中间件
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可能是外部的,不在您的控制范围内。测试环境中的所有内容都在我的控制范围内。