正确运行PUT方法的Rspec控制器测试

时间:2016-07-22 19:21:54

标签: ruby-on-rails ruby rspec

我正在我的模型的一个更新函数上编写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吗?

1 个答案:

答案 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的更多信息。