加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Rails测试 – 检查用户是否使用Devise登录

发布时间:2020-12-17 04:37:49 所属栏目:百科 来源:网络整理
导读:我试图通过向我的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,r
我试图通过向我的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所述.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读