Rspec 看跌操作规范未通过
Rspec spec for put action not passing
谁能看出为什么我的控制器放置规范无法通过?
控制器中的更新操作如下所示:
def update
@user = User.find(current_user.id)
respond_to do |format|
if @user.update_attributes(permitted_update_params)
format.html { redirect_to new_topup_path, notice: 'Billing address was succesfully updated' }
format.json { respond_with_bip(@user) }
else
format.html { render action: "edit" }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
我的规格如下:
context "given a user who wants to update their billing address" do
let!(:user) { create(:user, billing_address: "My initial address") }
before(:each) do
allow(controller).to receive(:current_user) {:user}
patch :update, { user: { :billing_address => "My Second address" } }
end
it "should update the users billing address" do
expect(user.billing_address).to eq("My Second address")
end
end
我的规范显示此消息:
Failure/Error: expect(user.billing_address).to eq("My Second address")
expected: "My Second address"
got: "My initial address"
您应该在预期之前重新加载您的用户:
before(:each) do
allow(controller).to receive(:current_user) {:user}
patch :update, { user: { :billing_address => "My Second address" } }
user.reload
end
您可能需要在测试中重新加载 user
实例。数据库已更新,但 user
实例不会自行更新以反映这一点。
expect(user.reload.billing_address).to eq("My Second address")
您的代码还有其他问题,例如这一行:
allow(controller).to receive(:current_user) {:user}
您已经使用 let(:user)
定义了一个用户,这意味着您现在有一个 user
变量可用于您的规范 - 注意 user
,而不是 :user
!
控制器规范应该测试动作的行为。您的操作行为大致可以描述为:
- 获取允许的参数
- 更新用户
- 如果更新成功,重定向
- 否则重新显示编辑页面
更新用户是模型的责任,而不是控制器的责任。如果您担心一组特定的参数会(或不会)更新用户实例,请创建一个模型规范并在那里测试参数。
谁能看出为什么我的控制器放置规范无法通过?
控制器中的更新操作如下所示:
def update
@user = User.find(current_user.id)
respond_to do |format|
if @user.update_attributes(permitted_update_params)
format.html { redirect_to new_topup_path, notice: 'Billing address was succesfully updated' }
format.json { respond_with_bip(@user) }
else
format.html { render action: "edit" }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
我的规格如下:
context "given a user who wants to update their billing address" do
let!(:user) { create(:user, billing_address: "My initial address") }
before(:each) do
allow(controller).to receive(:current_user) {:user}
patch :update, { user: { :billing_address => "My Second address" } }
end
it "should update the users billing address" do
expect(user.billing_address).to eq("My Second address")
end
end
我的规范显示此消息:
Failure/Error: expect(user.billing_address).to eq("My Second address")
expected: "My Second address"
got: "My initial address"
您应该在预期之前重新加载您的用户:
before(:each) do
allow(controller).to receive(:current_user) {:user}
patch :update, { user: { :billing_address => "My Second address" } }
user.reload
end
您可能需要在测试中重新加载 user
实例。数据库已更新,但 user
实例不会自行更新以反映这一点。
expect(user.reload.billing_address).to eq("My Second address")
您的代码还有其他问题,例如这一行:
allow(controller).to receive(:current_user) {:user}
您已经使用 let(:user)
定义了一个用户,这意味着您现在有一个 user
变量可用于您的规范 - 注意 user
,而不是 :user
!
控制器规范应该测试动作的行为。您的操作行为大致可以描述为:
- 获取允许的参数
- 更新用户
- 如果更新成功,重定向
- 否则重新显示编辑页面
更新用户是模型的责任,而不是控制器的责任。如果您担心一组特定的参数会(或不会)更新用户实例,请创建一个模型规范并在那里测试参数。