我正在使用Rails 5.2,Ruby 2.4.1和Rspec。我正在尝试使用Rspec进行自动化测试以更新用户密码。我知道代码可以通过手动测试工作。
RSpec测试未在控制器中通过@ user.update_attributes(user_params)条件,然后转到else条件。因此,我的RSpec测试表明密码仍然彼此相同。如何使我的RSpec测试通过条件?
这是方法
# Creates user, saves old password, generates a url for user to go to, updates password, reloads user, and test if old password equals new password
context "with a valid token" do
it "updates the user's password and resets the token" do
test_users = User.create(first_name: 'chase', last_name: 'dougherty', email: 'chase@gmail.com', password: '1', password_confirmation: '1')
old_password = test_users.password
test_users.generate_password_reset_token!
patch :update, params: { id: test_users.password_reset_token, user: { password: 'newpassword', password_confirmation: 'newpassword' } }
test_users.reload
expect(test_users.password).to_not eq(old_password)
end
end
这是管制员
# Finds user, test if update_attributes is true, updates password, logs user in, redirects user, displays flash
def update
@user = User.find_by(password_reset_token: params[:id])
if @user && @user.update_attributes(user_params)
@user.update_attribute(:password_reset_token, nil)
session[:user_id] = @user.id
redirect_to '/maps'
flash[:notice] = "Password updated"
else
flash[:notice] = "Password reset failure."
render action: 'edit'
end
end
private
def user_params
params.require(:user).permit(:password, :password_confirmation)
end
答案 0 :(得分:1)
如果update_attributes行失败,则您可能对User模型进行了一些验证,这些验证正在触发并导致其返回false。
此外,我建议不要在测试文件中“创建”用户对象。特别是因为第一次运行测试时,它将创建该条目,但是之后每次它将返回未保存到数据库的User实例(由于数据中的唯一性违例),因此测试可能不会以预期的。
除非您想在测试运行后清理创建的用户对象。否则,您将需要使用factory_bot并删除大多数这些模型和数据库调用。
答案 1 :(得分:0)
如果在has_secure_password
模型中使用user
方法,则可以使用以下语法检查密码是否已更改:
it "changes user's password" do
expect { send_request }.to change { user.reload.authenticate(password) }.from(false).to(user)
end