2016-10-24 4 views
0

Ich habe alle verwandten Beiträge durchgesehen, aber kann nicht herausfinden, wie mein Test zu bestehen ... Ich bekomme immer wieder eine Fehlermeldung, dass Food.count sollte um 1 geändert haben, aber es tat es nicht. Ich bin mir nicht sicher, ob es mit der Tatsache zu tun hat, dass meine create-Methode eine Beziehung aufbaut?Rails Test Post erstellen Methode RSPEC

def create 
    @food = current_user.foods.build(food_params) 

    if @food.save 
    redirect_to user_path(@food.user_id) 
    else 
    render 'new' 
    end 
end 

class Food < ApplicationRecord 
belongs_to :user 
has_many :votes, dependent: :destroy 

validates :title, :kind, :image, presence: true 

mount_uploader :image, ImageUploader 

def Food.random_soup 
    Food.all.where(kind: 'soup').shuffle 
end 
end 

create_table "foods", force: :cascade do |t| 
t.datetime "created_at", null: false 
t.datetime "updated_at", null: false 
t.string "kind" 
t.string "title" 
t.integer "wins" 
t.integer "loses" 
t.integer "user_id" 
t.string "image" 
t.text  "recipe" 
t.text  "description" 
end 

before(:each) do 
    user = create(:user) 
    sign_in(user) 
end 


describe "POST create" do 
    context "with valid attributes" do 
    it "creates a new food" do 
     food_params = FactoryGirl.attributes_for(:food) 
     expect { post :create, :food => food_params }.to change(Food, :count).by(1) 
    end 
    end 
end 


factory :food do |f| 
    f.kind "soup" 
    f.title "Clam Chowder" 
    f.id 1 
    f.image File.open(File.join(Rails.root, '/app/assets/images/Canada.png')) 
end 
+0

Haben Sie versucht, eine Puts-Anweisung in Ihrem @ food.save-Block zu platzieren, um zu sehen, ob es druckt? – Huy

+0

Ich habe nicht, aber ich hatte versucht, manuell zu testen, indem Sie ein neues Essen aus meiner App erstellen und den Code korrekt ausgeführt. Das neue Essen wurde auch in meiner Konsole –

+0

aufgeführt Ihre Aktion sieht gut aus. Ich könnte versuchen zu erklären, vorbei in den Lebensmitteln params (dh 'food_params = {Art: 'Suppe', Titel: 'Clam Chowder', Bild: 'test.jpg'}') – Huy

Antwort

0

Es ist wirklich das schwer zu beantworten, ohne mehr über Ihre @food Objekt zu kennen.

Es gibt eine Menge Dinge, die schief gehen könnten (food_params unvollständig oder fehlerhaft ist, @food.save falsch zurückkehrt, usw.)

Wenn ein einfacher Test, wie dies nicht das Beste, was vorbei Vergangenheit zu tun (von Erfahrung) ist, ein paar "Schlüssel" binding.pry s in Ihre create-Methode zu werfen, um genau zu sehen, was passiert, wenn Sie Ihren Test ausführen.

Wenn Sie nicht vertraut sind mit dem Edelstein pry Ich würde empfehlen, lesen Sie die README aber es ist im Wesentlichen eine Möglichkeit, die Ausführung zu stoppen und stochern mit einem IRB wie REPL.

def create 
    binding.pry 
    # check to see what the original count is/current_user 
    @food = current_user.foods.build(food_params) 
    binding.pry 
    # confirm that the relationship has been built (could be an issue with the way you are passing in params in the test and would be apparent here) 
    # + check the return value of @food.save 
    if @food.save 
    redirect_to user_path(@food.user_id) 
    else 
    render 'new' 
    end 
end 

mit diesen 2 pry s sollten Sie in der Lage sein, genau zu sehen, was los ist (entweder ein Problem mit dem create Verfahren oder ein kleines Problem mit dem Testaufbau.

Viel Glück mit dem Erhalten der Test geben

0

ich vermute, dass Ihre Test fein funktioniert und dass @food ist eigentlich ungültig.

Ohne weitere Details für die Lebensmittel Modell alles, was ich vorschlagen, können Sie so etwas wie die folgenden zu bestim versuchen ist Was die Fehler sind:

describe "POST create" do 
    context "with invalid attributes" do 
    it "should set errors" do 
     food_params = FactoryGirl.attributes_for(:food) 
     post :create, :food => food_params 
     puts assigns(:food).errors.inspect 
    end 
    end 
end 
+0

Ich habe meinen Beitrag bearbeitet, um weitere Informationen hinzuzufügen. Als ich deinen Vorschlag ausprobierte, sagte ich unbestimmte Methode: Fehler für Null. –