繁体   English   中英

Rails测试-检查用户是否使用Devise登录

[英]Rails test - checking if user is signed in with 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将尝试使用发布的参数对用户进行身份验证,如果提供的电子邮件/密码正确,则会返回user 无法保证create动作实际上是在调用sign_incurrent_user

即使我重新编写测试以检查是否调用了这些方法,也可能会调用其他方法,例如sign_out

有没有更明确的方法来最终检查用户是否已登录,如果已登录,则该用户是谁?

编辑-

例如,以下测试将通过

it 'must sign in a user' do
   @controller.current_user.must_equal nil
   post :create, format: :js, 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

对问题中的拟议代码进行最少更改的解决方案:

您需要在测试开始之前初始化系统。 在您t 'must be able to sign in a user' do代码之前,请尝试在以下代码之前添加代码:

before (:each) do
  user = FactoryGirl.create(:user)
  sign_out user
end

这应该将您的测试变成对后控制器有效的测试。

说明:

我的假设是,上面的测试始终会成功,因为用户已经登录(通过在此之前运行的其他测试)。 您可以通过在byebug的行中使用byebug进行验证it然后在bybug's控制台中运行current_user 如果不是nil ,则用户已经登录,这使您的测试无效。

注意,(与上面的注释中讨论的不同), current_user不会更改用户的状态; 它是一个只读功能。

更短/更清洁的解决方案:

我认为,有一种更干净的方法可以执行以下测试:

def sign_in_via_post(user)
  post :create, format: :js, user: {email: user.email, password: user.password, 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

使用should change from nil to user语句,您可以验证用户是否在测试开始之前注销,以及用户在执行测试之后已经登录。

注意,那部分

   { 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)

这里讨论的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM