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

控制器规范应该测试动作的行为。您的操作行为大致可以描述为:

  • 获取允许的参数
  • 更新用户
  • 如果更新成功,重定向
  • 否则重新显示编辑页面

更新用户是模型的责任,而不是控制器的责任。如果您担心一组特定的参数会(或不会)更新用户实例,请创建一个模型规范并在那里测试参数。