我使用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
如何打破这一点?以及如何解决此问题以使现有测试通过?
答案 0 :(得分:1)
当不使用js: true
时,Capybara使用的rack_test驱动程序将完全忽略主机名,因此唯一重要的是路径。当您使用js: true
时,使用的是真实的主机名,因为“浏览器”正在查询它们,以找出发出请求的位置。您有责任确保您的应用使用哪个主机名生成的URL都解析为该应用正在侦听的ip。最简单的解决方案是在/ etc / hosts中添加条目,以将用于测试的域名/子域名映射到127.0.0.1。
注意:Poltergeist现在使用PhantomJS,它相当于8-9岁的浏览器。这意味着您很可能会遇到尝试在其上运行React应用程序的问题,并且您应该真正考虑升级到现代浏览器的驱动程序-Selenium,Apparition等。