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
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
'@ line_item' n'est pas initialisé l'intérieur du bloc de test, c'est pourquoi il retourne' nil' –
vous devez initialiser '@ line_item' intérieur avant bloc –