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 无法神奇地理解数据库中的对象已更改。
我尝试在我的用户控制器中测试我的#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 无法神奇地理解数据库中的对象已更改。