任何人都可以看到为什么我的控制器的规格不会通过?
以下是我的控制器中的更新操作:
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"
答案 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)
控制器规范应测试操作的行为。您的行为可以大致描述为:
更新用户是模型的责任,而不是控制器。如果您担心一组特定参数将(或不会)更新用户实例,请创建模型规范并在那里测试参数。