Rspec spec for put action没有通过

时间:2015-10-14 09:06:36

标签: ruby-on-rails rspec controller put

任何人都可以看到为什么我的控制器的规格不会通过?

以下是我的控制器中的更新操作:

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"

3 个答案:

答案 0 :(得分:1)

您可能需要在测试中重新加载user实例。数据库已更新,但user实例不会自行更新以反映该数据库。

expect(user.reload.billing_address).to eq("My Second address")

您的代码还存在其他问题,例如:

allow(controller).to receive(:current_user) {:user}

您已使用let(:user)定义了一位用户,这意味着您现在可以使用user变量指标user,而不是:user!< / p>

答案 1 :(得分:0)

您应该在期望之前重新加载您的用户:

before(:each) do
   allow(controller).to receive(:current_user) {:user}
   patch :update, { user: { :billing_address => "My Second address" } }
   user.reload
end

答案 2 :(得分:0)

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

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

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