ruby-on-rails – Rails测试 – 检查用户是否使用Devise登录
我试图通过向我的SessionsController发出POST请求来测试某人能够登录我的网站.我在几个地方看过这种推荐方式:
it 'must be able to sign in a user' do user = create(:user) post :create,format: :js,user: {email: user.email,password: user.password,remember_me: 0} assert_response :success @controller.current_user.must_equal user end 但这个测试不正确.调用@ controller.current_user将尝试使用已发布的参数对用户进行身份验证,并在提供的电子邮件/密码正确时返回用户.无法保证创建操作实际上正在调用sign_in或current_user. 即使我重新编写测试以检查这些方法是否被调用,也可能会调用其他方法,例如登出. 是否有更明确的方法来最终检查用户是否已登录,如果是,用户是谁? 编辑 – 例如,以下测试将通过 it 'must sign in a user' do @controller.current_user.must_equal nil post :create,user: {email: @user.email,password: @user.password,remember_me: 0} assert_response :success @controller.current_user.must_equal @user end 当SessionsController #create动作是: def create respond_to do |format| format.js { render nothing: true,status: 200 } end end 解决方法
对问题中建议代码的最小更改的解决方案:
您需要在测试开始之前初始化系统.在“必须能够登录用户”代码之前尝试预先添加以下代码: before (:each) do user = FactoryGirl.create(:user) sign_out user end 这应该将您的测试变成您的后置控制器的有效测试. 说明: 我的假设是,上面的测试总是成功,因为用户已经登录(通过在此之前运行的其他测试).您可以通过在其后面的行中使用byebug来验证这一点,并在bybug的控制台中运行current_user.如果不是nil,则用户已经登录,这会使您的测试无效. 注意,(与评论中上面讨论的不同),current_user不会改变用户的状态;它是一个只读函数. 更短/更清洁的解决方案: 在我看来,有一种更清洁的方式来执行如下测试: def sign_in_via_post(user) post :create,remember_me: 0} end ... before (:each) do user = FactoryGirl.create(:user) sign_out user end it 'must be able to sign in a user' do { sign_in_via_post user }.should change { current_user }.from(nil).to(user) end 应该从nil更改为用户语句,验证用户在测试开始之前已注销,并且在执行测试后用户已登录. 注意,那个部分 { sign_in_via_post user }.should change { current_user }.from(nil).to(user) 相当于(可能更容易理解)代码 { sign_in_via_post user }.should change { user_signed_in? }.from(false).to(true) 如here所述. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |