Puffing Billy重定向不使用Webmock和Capybara Webkit

时间:2017-07-06 06:04:14

标签: ruby-on-rails rspec capybara capybara-webkit

我使用外部网站来处理我的身份验证。在我的主控制器中,我通过重定向到外部网站来执行此操作,外部网站会在用户进行身份验证后重定向回我的网站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不起作用,可能是因为它们使用不同的主机。

0 个答案:

没有答案