我正在尝试编写功能测试,以检查是否会将用户重定向到外部网站。
要在我的测试中禁止外部连接,我的 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
方法被击中两次)然后它会回到我的根路径。
知道我可能做错了吗?
提前致谢!
答案 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 - 而非通过功能/系统规范进行测试。