![](/img/trans.png)
[英]Rspec for checking whether a user is signed in or not in rails using devise gem
[英]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_in
或current_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.