我在使用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在子域名中不能很好地发挥作用吗?
答案 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
附带的子域。这将返回host
中url
之前的子域数组。
在我的测试中,我将ActionDispatch::Request
存根接受:subdomains
方法并使用提供的子域进行响应。然后,它可以在控制器中进行验证。
因为有些地方我在路由网址中动态设置了subdomain
属性,所以request.subdomain
(网址中的新设置)和{{1}的值不同(在url中设置一个之前的旧的)。所以我决定使用新版本,然后将其与request.subdomains
分开,因为这是我需要使用的。
更改后,我忘记更新规范中的存根,将请求方法更改为.split('.')
。
更改后,一切正常。
我希望这有助于任何人面对同样的问题。至少它会提醒他们更新他们拥有的所有存根(如果有的话)。
<强> [更新] 强> 显然,我为2子域方法获得不同值的原因是因为规范中的存根。