rspec + webkit 在第一次请求后丢失 session/cookie
rspec + webkit is losing session/cookie after first request
使用 rspec 和默认驱动程序工作正常,所有测试都通过了。
改变driver: :webkit
会有不好的副作用。
- 步骤:用户已登录
- 步骤:访问 root_path 会话 (current_user)
- 步骤:访问 root_path 没有会话 (current_user = nil)
因此,无论是在第一个 visit root_path
之后还是在第二个之前,会话都会被终止或发生其他情况 - 我们无法让用户保持登录状态。
测试看起来像这样
scenario 'something', driver: :webkit do
user = FactoryGirl.create :user
login_as(user)
visit root_path
visit root_path
end
这是已知错误吗?是否有任何解决方法或者我们是否遗漏了什么?
根据要求:
def login_as(user)
visit root_path
click_on "Login"
fill_in "user[login]", with: user.username
fill_in "user[password]", with: user.password
click_on "Sign in"
end
如果您是在第一次访问后删除会话,则预计用户会注销。
没有会话访问是否意味着匿名访问该页面?
默认驱动程序同步运行所有内容 --- 使用真实浏览器并支持 javascript 的驱动程序不一定同步执行操作 - 因此在 click_on 的机架测试以外的驱动程序中是可能的 'Sign in' 到 return 立即。因此,如果您不检查成功后会看到的内容,则下次访问 root_path 可以立即执行并取消提交登录表单。要解决此问题,请添加类似
的内容
expect(page).to have_content('You are now logged in') # whatever text is shown on a successful login
作为 login_as 方法的最后一行。这对大多数人来说通常不是问题,因为登录后下一步通常是点击页面上的某个东西,这会让 Capybara 等待该项目出现,从而等待登录完成。
如果这不是这里发生的情况,那么唯一可以将用户注销的地方(给定您的示例代码)是您自己的应用程序
使用 rspec 和默认驱动程序工作正常,所有测试都通过了。
改变driver: :webkit
会有不好的副作用。
- 步骤:用户已登录
- 步骤:访问 root_path 会话 (current_user)
- 步骤:访问 root_path 没有会话 (current_user = nil)
因此,无论是在第一个 visit root_path
之后还是在第二个之前,会话都会被终止或发生其他情况 - 我们无法让用户保持登录状态。
测试看起来像这样
scenario 'something', driver: :webkit do
user = FactoryGirl.create :user
login_as(user)
visit root_path
visit root_path
end
这是已知错误吗?是否有任何解决方法或者我们是否遗漏了什么?
根据要求:
def login_as(user)
visit root_path
click_on "Login"
fill_in "user[login]", with: user.username
fill_in "user[password]", with: user.password
click_on "Sign in"
end
如果您是在第一次访问后删除会话,则预计用户会注销。
没有会话访问是否意味着匿名访问该页面?
默认驱动程序同步运行所有内容 --- 使用真实浏览器并支持 javascript 的驱动程序不一定同步执行操作 - 因此在 click_on 的机架测试以外的驱动程序中是可能的 'Sign in' 到 return 立即。因此,如果您不检查成功后会看到的内容,则下次访问 root_path 可以立即执行并取消提交登录表单。要解决此问题,请添加类似
的内容expect(page).to have_content('You are now logged in') # whatever text is shown on a successful login
作为 login_as 方法的最后一行。这对大多数人来说通常不是问题,因为登录后下一步通常是点击页面上的某个东西,这会让 Capybara 等待该项目出现,从而等待登录完成。
如果这不是这里发生的情况,那么唯一可以将用户注销的地方(给定您的示例代码)是您自己的应用程序