RSpec + Capybara:redirect_to外部页面将我发送回root_path

时间:2018-03-08 10:42:53

标签: ruby-on-rails rspec capybara

我正在尝试编写功能测试,以检查是否会将用户重定向到外部网站。

要在我的测试中禁止外部连接,我的 spec_helper.rb 中包含以下内容:

require 'webmock/rspec'
WebMock.disable_net_connect!(allow_localhost: true)

我的规范做了类似的事情:

it 'redirects safely' do
  visit "/some/route"

  expect(page).not_to have_content 'MyWebsite'
end

在我的ApplicationController中,我有一个before_action,它应该根据条件在外部重定向:

class ApplicationController < ActionController::Base
  before_action :redirect_to_external_website, if: :unsupported_path

  private

  def redirect_to_external_website
    redirect_to 'https://some.other.website'
  end

  def unsupported_path
    # Some conditions
  end 
end

重定向在开发过程中按预期工作。

然而,当我运行规范时,我发现有两个重定向发生(我认为redirect_to_external_website方法被击中两次)然后它会回到我的根路径。

知道我可能做错了吗?

提前致谢!

1 个答案:

答案 0 :(得分:2)

由于您没有指定与Capybara一起使用的驱动程序 - https://github.com/teamcapybara/capybara#drivers - 我假设您使用的是默认的rack_test驱动程序。

rack_test驱动程序不支持对外部URL的请求(域信息被忽略,所有路径都直接路由到AUT),因此您的测试实际上并没有测试您的想法和{ {1}}实际上只是在您的本地应用中重定向到redirect_to 'https://some.other.website'(因为rack_test驱动程序看到&#39; https://some.other.website/&#39;,忽略所有域名内容并将其视为&# 39; /&#39;在您测试的应用中)。

如果您正在使用Capybara支持的其他驱动程序支持外部URL(selenium,poltergeist,capybara-webkit等),那么您的WebMock不会按照您的想法进行操作,因为它只控制你的AUT发出的请求,它不会控制任何&#34;浏览器&#34;这些驱动程序使用它们可以自由地向外部URL发出请求。

您正在考虑测试的功能更适合通过请求规范进行测试 - https://relishapp.com/rspec/rspec-rails/docs/request-specs/request-spec - 而非通过功能/系统规范进行测试。