Rspec、Capybara和Poltergiest:只有在启用js:true时才能访问服务器



我使用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等。

相关内容

  • 没有找到相关文章

最新更新