2016-07-22 4 views
0

私のモデルのアップデート機能の1つで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

セットアップの仕方に基づいて、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) 

は中strong parametersについてもっと読みますRailsガイド。

+0

'require(:order)'がないとどうなりますか?私はorders_controller.rbを更新しました。 – JoHksi

+0

あなたは 'fetch'か' require'のどちらかを呼び出す必要があり、 'permit'を連鎖させる必要があります。 (あなたはおそらく 'require'を使いたいと思うでしょう。)あなたがもっと情報を必要とするならば、私がリンクしているドキュメントを読んでください。 –

+0

もう1つ質問があります。私のOrder.rbでは、order_typeを 'presence:true'に設定しました。更新 'order_type'を' nil'として渡すと更新されません。しかし、それはnilに更新されます。私はここで間違って何をしていますか? – JoHksi

関連する問題