在我的Rails应用程序中,我正在使用Devise
用户身份验证。当用户登录到应用程序时,Devise
对该用户进行身份验证并为该特定用户创建会话。
我需要测试,当用户登录时,会为该用户创建一个会话。我怎么做?
在接受测试中,如果我做类似的事情,
feature 'User logs in' do
scenario 'with valid email and password' do
log_in_with '[email protected]', 'password'
expect(page).to have_content('Log out')
end
def log_in_with(email, password)
visit new_user_session_path
fill_in 'Email', with: email
fill_in 'Password', with: password
click_button 'Log in'
end
end
我仍然没有检查是否为登录用户创建了新会话。这不符合我的要求,因为我没有检查是否创建了实际的用户会话。
现在,如果我warden
改用:
user = FactoryGirl.create(:user)
login_as(user, :scope => :user)
...
我只是说用户要登录,然后转到下一步,例如检查“注销”链接或“编辑配置文件”链接,但不检查用户的会话创建。
如果我在控制器规格中执行此操作,则可以访问sign_in
和sign_out
方法:
describe Devise::SessionsController do
it "user signed in successfully" do
logged_user = User.create(:email => "[email protected]", :password => "12345678")
sign_in logged_user
expect(controller.user_session).not_to be nil
end
end
在这里,我有机会获得user_session
,current_user
,user_signed_in?
方法。在这3个选择中,我选择了user_session
它,因为它似乎与当前用户会话相关。这是正确的方法吗?还是有另一种替代方法或直接方法可用于检查会话是否处于活动状态或已为用户创建?有没有办法在我的验收测试中检查这种情况?
我很确定您可以使用Controller规范中的会话哈希访问所有会话数据。假设您可以使用它来检查登录后是否设置了user_id会话密钥:
expect(session[:user_id]).to_not be_nil
而且,当然,您可以使用它来检查可能在整个应用程序中添加的任何会话。
如果您确实想查看由Devise创建的会话,则可以访问在会话中生成的Warden密钥:
expect(session["warden.user.user.key"][0].first).to eql logged_user.id
这是不必要的,因为这已在Devise中进行过测试,因此仅在用户登录时进行测试就足够了。
有一个伟大的职位有关测试Omniauth控制器,也用于测试SessionsController一个很好的指南。它使用RSpec的旧的should语法,但是应该可以理解= P
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句