2016-07-22 10 views
0

Ich schreibe einen Rspec-Controller-Test an einer der Update-Funktionen meines Modells. Das Modell, das ich teste, ist Order.Rspec Controller-Test auf PUT-Methode korrekt ausführen

Wenn ich Controller-Test ausführen, sehe ich Order_Attributes werden jetzt nicht aktualisiert.

Im Folgenden finden Sie 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 

Controller spec Ich habe wie folgend:

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 

Hier factory für den Auftrag Modell ist:

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 

Im Controller-Test Ich sehe, dass order_attributes nicht aktualisiert werden. Selbst wenn ich user_id auf 19 aktualisiere, wird es nicht wiedergegeben. Übergebe ich order_params falsch?

+0

Wie sieht Ihre 'order_params' Methode im Controller aus? –

+0

@ChrisPeters, ich habe aktualisiert. – JoHksi

Antwort

1

Basierend darauf, wie es scheint, dass Sie Dinge Setup haben, sieht es so aus, als müssten Sie Ihre eigene order_params Methode mit zulässigen Parametern von params[:order] definieren.

So muss dies den private Abschnitt Ihres Controller hinzugefügt werden:

def order_params 
    # Add other attributes that you want to allow on the `order` object. 
    params.require(:order).permit(:user_id, :order_type) 
end 

Dann wird der Anruf an put in Ihrem Test soll wie folgt aussehen: mehr

put :update, id: order.id, order: FactoryGirl.attributes_for(:order, user_id: 19) 

Lesen Sie mehr über strong parameters in die Rails-Guides.

+0

Was passiert, wenn ich 'require (: order)' nicht habe? Ich habe orders_controller.rb aktualisiert – JoHksi

+0

Sie müssen entweder 'fetch' oder' require' aufrufen und davon 'choose' abketten. (Wahrscheinlich möchten Sie 'require' verwenden.) Lesen Sie die Dokumente, zu denen ich Sie verlinkt habe, wenn Sie weitere Informationen benötigen. –

+0

Eine weitere Frage. In meiner Order.rb setze ich order_type als 'present: true'. Wenn ich update 'order_type' als 'nil' übergebe, sollte es nicht aktualisiert werden. Aber es wird auf Null aktualisiert. Was mache ich hier falsch? – JoHksi

Verwandte Themen