如何在RSpec中测试更新用户密码

时间:2018-06-27 16:49:28

标签: ruby-on-rails rspec automated-tests

我正在使用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

2 个答案:

答案 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