使用url路由的Capybara-webkit意外行为返回空白页面

时间:2016-04-25 12:04:26

标签: rspec capybara capybara-webkit

我在使用Capybara-webkit时遇到了问题。像这样的简单示例代码应该显示登录页面失败:

feature 'user signs in' do
  scenario 'sign in successfully', js: true do
    user = create(:user)

    visit new_user_session_url
    expect(page).to have_text 'Sign in'
  end
end

它给出了一条失败的消息:

Failure/Error: expect(page).to have_text 'Sign in'
    expected to find text "Sign in" in ""

save_and_open_page显示空白页<body></body>。如果移除js: true,一切正常。

我知道此规范并不需要设置js。但依赖javascript的规范也失败了。所以这只是一个示例规范。

有人解释为什么Capybara-webkit表现得像这样?这是正常的,是一个问题,还是有些东西没有正确设置?

[注] 该应用使用子域名。可能是因为Capybara-webkit在子域名中不能很好地发挥作用吗?

2 个答案:

答案 0 :(得分:0)

您是否在测试环境中设置了config.action_controller.default_url_options(通常是test.rb)。 url帮助程序使用指定的主机来构建url,并且需要是一个解析为capybara接口的主机名运行测试应用程序(通常是127.0.0.1) - 你可以通过查看new_user_session_url来检查这个正在测试代码中返回。

答案 1 :(得分:0)

问题来自我自己的错误。在我的控制器中,我正在使用request.url检查request.subdomains附带的子域。这将返回hosturl之前的子域数组。

在我的测试中,我将ActionDispatch::Request存根接受:subdomains方法并使用提供的子域进行响应。然后,它可以在控制器中进行验证。

因为有些地方我在路由网址中动态设置了subdomain属性,所以request.subdomain(网址中的新设置)和{{1}的值不同(在url中设置一个之前的旧的)。所以我决定使用新版本,然后将其与request.subdomains分开,因为这是我需要使用的。

更改后,我忘记更新规范中的存根,将请求方法更改为.split('.')

更改后,一切正常。

我希望这有助于任何人面对同样的问题。至少它会提醒他们更新他们拥有的所有存根(如果有的话)。

<强> [更新] 显然,我为2子域方法获得不同值的原因是因为规范中的存根。