2016-05-24 1 views
0

Je travaille sur le développement Web Agile avec ruby ​​on rails. Lors de l'exécution d'un test, je reçois le texte suivant:NoMethodError: méthode non définie

Error: LineItemsControllerTest#test_should_update_line_item: 
NoMethodError: undefined method 'product_id' for nil:NilClass 
     test/controllers/line_items_controller_test.rb:13:in `block in <class:LineItemsControllerTest> 

Voici mon fichier de test

require 'test_helper' 

class LineItemsControllerTest < ActionController::TestCase 
    test "should create line_item" do 
    assert_difference('LineItem.count') do 
     post :create, product_id: products(:ruby).id 
    end 

    assert_redirected_to cart_path(assigns(:line_item).cart) 
    end 

test "should update line_item" do 
    patch :update, id: @line_item, line_item: { product_id: @line_item.product_id } 
    assert_redirected_to line_item_path(assigns(:line_item)) 
end 

end 

quelqu'un de bien vouloir expliquer pourquoi je reçois un NoMethodError: méthode non définie alors que le livre dit qu'il devrait être bien?

Merci!

Update 1

selon le commentaire de Boltz0r ci-dessous, voici mes méthodes créer et mettre à jour. J'ai essayé de comparer ce que j'ai par rapport à ce qui est dans le livre et je n'arrive pas à trouver le problème.

def create 
    product = Product.find(params[:product_id]) 
    @line_item = @cart.add_product(product.id) 


    respond_to do |format| 
     if @line_item.save 
     format.html { redirect_to @line_item.cart, notice: 'Line item was successfully created.' } 
     format.json { render :show, status: :created, location: @line_item } 
     else 
     format.html { render :new } 
     format.json { render json: @line_item.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def update 
    respond_to do |format| 
     if @line_item.update(line_item_params) 
     format.html { redirect_to @line_item, notice: 'Line item was successfully updated.' } 
     format.json { render :show, status: :ok, location: @line_item } 
     else 
     format.html { render :edit } 
     format.json { render json: @line_item.errors, status: :unprocessable_entity } 
     end 
    end 
    end 
+1

votre '@ line_item' n'est pas initialisé partout et il est donc' nil'. Il devrait probablement être initialisé avant le bloc. Logiquement, vous mettez à jour quelque chose qui existe déjà, donc pour tester la mise à jour, vous devez créer quelque chose que vous allez mettre à jour. – yefrem

+1

'@ line_item' n'est pas initialisé l'intérieur du bloc de test, c'est pourquoi il retourne' nil' –

+1

vous devez initialiser '@ line_item' intérieur avant bloc –

Répondre

1

J'ai vérifié l'exemple du livre et je vais donc poster la réponse quelqu'un d'autre pourrait le voir. Si vous allez tester est update opération, vous devriez avoir quelque chose à mettre à jour en premier. C'est la raison pour laquelle le test du livre et de toute autre vie réelle a méthode setup pré-créer élément de test:

setup do 
    @line_item = line_items(:one) 
end 
+0

Merci cela a fonctionné! Je suis un débutant à cela et voudrais des conseils quant à quoi d'autre à étudier pour améliorer ma compréhension de Rails. Depuis que vous avez parcouru le livre, pouvez-vous me conseiller sur le matériel que vous avez étudié par la suite? – Salamit

+1

@Salamit Je ne sais pas si mon conseil serait pertinent car je suis passé à Ruby après quelques années de PHP. J'ai commencé avec quelques guides et tutoriels, y compris ceux officiels de Rails, puis j'ai pris le livre car mes connaissances semblaient être un peu fragmentées.Je peux vous suggérer de consulter également ces guides, puis essayer de créer votre propre application en suivant les meilleures pratiques que vous voyez dans le livre (comme TDD). Après cela décidez en fonction de votre objectif général (pourquoi avez-vous commencé tout ce truc Ruby/Rails). – yefrem

+1

@Salamit aussi s'assurer que vous savez apprendre Ruby lui-même à un niveau décent. Comme RoR est une sorte de framework par défaut, beaucoup de gens commencent leur chemin Ruby avec RoR. Ce n'est pas si mal que cela peut vous donner un sentiment d'exemples et d'applications de la vie réelle, mais n'oubliez pas d'apprendre Ruby et ses astuces de méta-programmation cool. – yefrem

1

Ce que cela signifie est que l'erreur ici:

patch :update, id: (at)line_item, line_item: { product_id: (at)line_item.product_id } 

le (at) Line_Item est nul. cela signifie que vous avez probablement une erreur soit sur la méthode create, soit sur la méthode update (vous n'obtenez pas le bon line_item)

+0

Merci pour votre commentaire. J'ai mis à jour mon message avec mes méthodes de création et de mise à jour. Pourriez-vous y jeter un coup d'œil? Merci beaucoup! – Salamit