2016-07-22 78 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