我使用Rails 4、rspec Rails 3.6和capybara 2.18进行了工作集成/功能测试。我正试图让这些测试在javascript框架(React(中重写的页面上通过。为此,我需要使用Poltergeist等驱动程序,而不是默认的无头浏览器,以便javascript可以在测试页面上运行。
我安装了恶作剧软件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
请注意,此url在我们的应用程序中使用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
是如何打破这一局面的呢?我该如何解决这个问题以使我现有的测试通过?
当不使用js: true
时,Capybara使用的是rack_test驱动程序,它完全忽略主机名,所以唯一重要的是路径。当您使用js: true
时,会使用真实的主机名,因为"浏览器"正在查询它们,以确定在哪里发出请求。您有责任确保您的应用程序生成的URL解析为应用程序正在侦听的ip。最简单的解决方案是向/etc/hosts添加条目,将您用于测试的域/子域名称映射到127.0.0.1。
注意:Poltergeist使用的PhantomJS相当于一个已有8-9年历史的浏览器。这意味着你在尝试运行React应用程序时很可能会遇到问题,你真的应该考虑升级到现代浏览器的驱动程序-Selenium、Apparition等。