我正在尝试测试通过Devise gem登录后会发生什么。例如,我让控制器在用户成功登录后转到student_dashboard_path。
我如何使用Capybara和Rspec进行测试?
我目前有这个:
/spec/features/user_signs_in_sees_dashboard_spec.rb
require 'rails_helper'
feature 'User sign in' do
scenario 'successfully from sign in page and sees student dashboard' do
sign_in
visit student_dashboard_path
expect(current_path).to eq(student_dashboard_path)
end
end
我有这个:
/spec/support/features/sign_in.rb
module Features
def sign_in
visit user_session_path
fill_in 'Email', with: User.first.email
fill_in 'Password', with: User.first.password
click_button 'Log in'
end
end
我收到此错误消息:
1) User signs in successfully from sign in and sees dashboard
Failure/Error: expect(current_path).to eq(student_dashboard_path)
expected: "/student/dashboard"
got: "/student/login"
我不确定为什么我无法登录并查看学生信息中心。
答案 0 :(得分:1)
对于仍在Capybara上的人,我将在下面留下原来的答案。 2.5.0但在2.5.0中你现在可以做到
expect(page).to have_current_path(<expected path>)
它会在检查路径时使用Capybara的等待行为
----以下仅适用于Capybara版本&lt; 2.5.0
expect(current_path).to eq(...)不等待路径改变,它只是比较它被调用时的当前路径。如果您在点击按钮后进入睡眠我打赌它有效。更好的解决方案是拥有像
这样的东西expect(page).to have_text('You are now logged in')
在click_button之后。这会导致capybara等到登录完成,页面加载(并显示登录通知),因此直到current_path也发生了变化。
答案 1 :(得分:0)
在中间使用capybara save_and_open_page
来判断字段是否设置正确。如果您在同一台计算机上工作,可以切换到 selenium 以在真实浏览器上进行测试。
另外请确保此代码不需要任何JS工作,因为默认的capybara匹配器将无法运行它。