RSPEC #update 测试无法更新某些参数

RSPEC test of #update cannot update some parameters

我尝试在我的用户控制器中测试我的#UPDATE 方法。我的字段(名字、姓氏、电子邮件、phone_number)的更新在我的本地主机上完全正常,但我无法通过测试。这是我的代码

我的用户控制器中有这个:

def update
@user = User.find(params[:id])
authorize(@user)
@user.skip_reconfirmation! if @user.is_a_customer?
respond_to do |format|
  if @user.update(user_params)
    format.html { redirect_to user_account_path, notice: 
      I18n.t('User_was_successfully_updated') }
             format.json { render json: @user, status: :ok}
  else
    format.html { render :edit }
    format.json { render json: @user.errors, status: 
                 :unprocessable_entity }
  end
end

这是我的 RSPEC 测试:

 RSpec.describe UsersController, type: :controller do
  describe "PATCH update" do
    let(:user)        { create(:customer_user) }

    before :each do
      sign_in user
    end

    it "update the user information" do
      allow(User).to receive(:find_by).and_return(user)

      new_attributes = {
          firstname: 'Roger',
          lastname: 'Rabbit',
          email: 'roger.rabbit@lapin.fr',
          mobile_phone_number: '0606060606',
          gender: 'female',
      }
      patch :update, params: { locale: I18n.locale,
                                      id: user.id,
                                      user: new_attributes
                                    }
      expect(user.firstname).to eq(new_attributes['firstname'])
      expect(user.lastname).to eq(new_attributes['lastname'])
      expect(user.email).to eq(new_attributes[:email])
      expect(user.mobile_phone_number).to 
         eq(new_attributes[:mobile_phone_number])
    end

最后,这是错误信息:

  0) UsersController PATCH update user is a user update the user information
 Failure/Error: expect(user.email).to eq(new_attributes[:email])

   expected: "roger.rabbit@lapin.fr"
        got: "customer@ecity.fr"

   (compared using ==)
 # ./spec/controllers/users_controller_spec.rb:29:in `block (4 levels) in <top (required)>'

还有两件事: - 名字和姓氏的测试通过 - new_attributes['email'] 和 new_attributes['mobile_phone_number'] return 尼尔斯;这就是为什么我用符号表示最后两个期望的关键

您需要重新加载 user 对象。

patch :update, ...

user.reload # ⇐ THIS

expect(user.firstname).to ...

如果不重新加载,您的测试中就会有陈旧的对象,Rails 无法神奇地理解数据库中的对象已更改。