我正在我的模型的一个更新函数上编写Rspec控制器测试。我正在测试的模型是Order
。
当我运行控制器测试时,我看到order_attributes现在没有更新。
以下是order_controller.rb:
before_action :set_order, only: [:show, :edit, :update, :destroy]
def update
if @order.update(order_params)
render json: @order, status: :ok, location: @order
else
render json: @order.errors, status: :unprocessable_entity
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_order
@order = Order.find(params[:id])
end
def order_params
params.permit(:order_type)
end
end
我拥有的控制器规范如下:
let(:order) {
FactoryGirl.create(:order)
}
describe "PUT #update" do
context "valid attributes" do
it "changes order's attributes" do
put :update, id: order.id, order_params: FactoryGirl.attributes_for(:order, user_id: 19)
order.reload
expect(assigns(:order).user_id).to match(order.user_id)
end
end
end
这是FactoryGirl的订单型号:
require 'faker'
FactoryGirl.define do
factory :order do
order_type Order.order_types[:serviceA]
association :user
before(:create) do |order|
order.user = FactoryGirl.create(:user)
end
end
end
在控制器测试中,我看到order_attributes没有更新。即使我将user_id更新为19,也不会反映出来。我是以错误的方式传递order_params吗?
答案 0 :(得分:1)
根据您设置的内容的显示方式,您似乎需要使用order_params
中允许的参数定义自己的params[:order]
方法。
因此需要将其添加到控制器的private
部分:
def order_params
# Add other attributes that you want to allow on the `order` object.
params.require(:order).permit(:user_id, :order_type)
end
然后,您测试中对put
的调用应如下所示:
put :update, id: order.id, order: FactoryGirl.attributes_for(:order, user_id: 19)
在Rails指南中阅读有关strong parameters的更多信息。