2016-07-22 76 views
0

我正在为我的模型的更新函数之一编写Rspec控制器测试。我正在测试的模型是Order对PUT方法正确运行Rspec控制器测试

当我运行控制器测试时,我看到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

你的'order_params'方法在控制器中看起来像什么? –

+0

@ChrisPeters,我已更新。 – JoHksi

回答

1

根据看起来您已经设置好的东西,看起来您需要使用允许的参数params[:order]来定义您自己的order_params方法。

因此,这需要被添加到您的控制器的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) 

了解更多关于strong parameters在Rails指南。

+0

如果我没有'require(:order)',该怎么办?我更新了orders_controller.rb – JoHksi

+0

您需要调用'fetch'或'require'并链接'permit'。 (您可能想要使用'require'。)如果您需要更多信息,请阅读我链接到的文档。 –

+0

还有一个问题。在我的Order.rb中,我将order_type设置为“presence:true”。当我将更新'order_type'作为'nil'传递时,它不应该更新。但它确实更新为零。我在这里做错了什么? – JoHksi