2016-10-24 5 views
0

J'ai regardé tous les articles liés, mais je n'arrive pas à comprendre comment faire passer mon test ... Je continue à recevoir une erreur disant que Food.count aurait dû changer de 1 mais ce n'est pas le cas. Je ne suis pas sûr si cela a à voir avec le fait que ma méthode create crée une relation?Rails test poster créer la méthode 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

Avez-vous essayé de placer une déclaration puts dans votre @ bloc food.save pour voir si elle imprime? – Huy

+0

Je ne l'ai pas fait, mais j'ai essayé de tester manuellement en créant un nouvel aliment à partir de mon application, et le code exécuté correctement. La nouvelle nourriture a également été répertorié dans ma console –

+0

votre action de création semble très bien. Je pourrais essayer d'expliquer en passant les params de nourriture (ie 'food_params = {genre: 'soupe', titre: 'chaudrée de palourdes', image: 'test.jpg'}') – Huy

Répondre

0

Il est vraiment difficile de répondre à cela sans en savoir plus sur votre objet @food.

Il y a beaucoup de choses qui pourraient aller mal (food_params est incomplète ou mal formée, @food.save est soit faux, etc.)

Quand un simple test comme celui-ci ne passe pas la meilleure chose à faire (du passé expérience) consiste à lancer quelques "clés" binding.pry dans votre méthode create pour voir exactement ce qui se passe lorsque vous exécutez votre test.

Si vous n'êtes pas familier avec la pierre précieuse pry je recommande la lecture du README mais son essentiellement un moyen d'arrêter l'exécution et farfouiller avec un IRB comme 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 

avec ces 2 pry s, vous devriez être en mesure de voir exactement ce qui se passe (soit un problème avec la méthode create ou d'un problème mineur avec la configuration de test.

Bonne chance à obtenir le test passer

0

Je soupçonne que votre test fonctionne bien et que @fruits est en fait invalide.

Sans plus de détails sur le modèle alimentaire tout ce que je peux suggérer est que vous essayez quelque chose comme ce qui suit à déterm ine ce que les erreurs sont:

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

J'ai modifié mon message pour inclure plus d'informations. Quand j'ai essayé votre suggestion, je disais méthode non définie: erreurs pour rien. –