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

前端之家收集整理的这篇文章主要介绍了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所述.

猜你在找的Ruby相关文章