我使用外部网站来处理我的身份验证。在我的主控制器中,我通过重定向到外部网站来执行此操作,外部网站会在用户进行身份验证后重定向回我的网站callback
网址。
我试图使用Puffing Billy在RSpec中存根这种行为。
这是我的控制器
class AuthController < ApplicationController
# `root_path` routes to here
def connect
some_external_url = "https://partner.co/some/path?foo=bar"
redirect_to(some_external_url)
end
# `auth_callback_path` routes to here
# The external site will also send over some data in the params,
# which will need to be stubbed as well in the specs below
def callback
data = params[:data]
binding.pry
# do stuff
end
end
我的spec_helper
已将Webmock和Capybara配置如下
# Set webmock and capybara drivers
WebMock.disable_net_connect!(allow_localhost: true)
Capybara.current_driver = :webkit_billy
Capybara.javascript_driver = :webkit_billy
最后,功能规范本身会进行存根和测试
before(:each) do
# Stub the external url so that it redirects to the `callback` action above
proxy.stub("https://partner.co/some/path").and_return(Proc.new { |params|
data = params["foo"] == "bar" ? "good data" : "bad data"
url = auth_callback_url(data: data)
{ redirect_to: url }
})
end
it "should work" do
visit root_path
puts current_url #=> "https://partner.co/some/path?foo=bar"
end
我看到的问题是重定向本身并不起作用。在访问根路径并重定向到合作伙伴的网站后,它永远不会重定向回我的应用,即使我在Proc
对象中配置了它。
这可能是Webmock的一些干扰吗?或者我错误配置了存根?
谢谢!
修改
经过上面的各种迭代测试后,决定简化并查看在访问一些普通的旧静态页面时是否按预期使用代理。
打破打击代码片段:
# spec/spec_helper.rb
RSpec.configure do |config|
config.before(:each, :use_puffing_billy) do
Capybara.default_driver = :webkit_billy
Capybara.javascript_driver = :webkit_billy
end
end
# spec/feature/my_spec.rb
it "can do stuff", :use_puffing_billy, js: true do
#
# `/contact` is a standard "Contact Us" static page. It requires no
# authentication, has no redirects, etc... making it useful for simply
# testing whether the page loads or not
#
# Capybara.app_host => nil
# Billy.config.proxy_host => "localhost"
visit contact_url
binding.pry
#
# current_url => "http://www.example.com:51984/contact"
# page.body.present? => false
visit contact_path
binding.pry
#
# current_url => "http://127.0.0.1:51984/contact"
# page.body.present? => true
end
似乎current_url
不起作用,current_path
不起作用,可能是因为它们使用不同的主机。