Rspec,Capybara和Poltergiest:仅在启用js:true时才无法访问服务器

时间:2020-02-26 15:57:22

标签: ruby-on-rails rspec capybara poltergeist

我使用Rails 4,rspec-rails 3.6和capybara 2.18进行了集成/功能测试。我正在尝试使这些测试通过在javascript框架(React)中被重写的页面。为此,我需要使用诸如Poltergeist之类的驱动程序而不是默认的无头浏览器,以便javascript可以在测试页上运行。

我已经安装了poltergeist 1.18。我添加了Capybara.javascript_driver = :poltergeist,没问题。测试通过旧的页面(仅html)。

但是只是js: true添加到现有的有效测试中(即,在将呈现的页面更改为新版本之前),并且测试失败,并显示

Request to 'http://account.example.com/user/sessions/new' failed to reach server, check DNS and/or server status

请注意,该网址正在我们的应用程序中使用account子域,这可能与问题有关。

这是孤立的失败测试之一。

feature 'Vistor tries to login', js: true do
  scenario 'with valid login', :with_project_access_user do
    visit new_user_sessions_url
    fill_in 'user_session[login]', with: 'test@gmail.com'
    fill_in 'user_session[password]', with: 'mysweetpassword'
    click_button 'Log In'
    expect(current_url).to match('http://account\.')
  end
end

第一行失败:visit new_user_sessions_url。如果我删除js" true,则此测试通过。在这两种情况下,new_user_sessions_url都是"http://account.example.com/user/sessions/new"

在此处无法使用new_user_sessions_path而不是new_user_sessions_url,因为子域是路由的必需部分。如果有解决子域匹配的方法(不删除子域-它们在我们的生产应用中使用),那是完全可以接受的解决方案。

由于该测试无需使用js: true,因此我必须假设Capybara正在幕后处理example.com域。但是添加js: true如何打破这一点?以及如何解决此问题以使现有测试通过?

1 个答案:

答案 0 :(得分:1)

当不使用js: true时,Capybara使用的rack_test驱动程序将完全忽略主机名,因此唯一重要的是路径。当您使用js: true时,使用的是真实的主机名,因为“浏览器”正在查询它们,以找出发出请求的位置。您有责任确保您的应用使用哪个主机名生成的URL都解析为该应用正在侦听的ip。最简单的解决方案是在/ etc / hosts中添加条目,以将用于测试的域名/子域名映射到127.0.0.1。

注意:Poltergeist现在使用PhantomJS,它相当于8-9岁的浏览器。这意味着您很可能会遇到尝试在其上运行React应用程序的问题,并且您应该真正考虑升级到现代浏览器的驱动程序-Selenium,Apparition等。