微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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所述.

原文地址:https://www.jb51.cc/ruby/269585.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐