我正在使用ruby on rails进行敏捷Web开发。在运行测试时,我得到以下结果:
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>
这是我的测试文件
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
有人可以解释为什么我会得到NoMethodError:未定义的方法,而书中说它应该没问题?
谢谢!
更新1
根据下面Boltz0r的评论,这是我的创建和更新方法。我尝试比较我所拥有的内容与书中的内容,但似乎无法找到问题所在。
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
答案 0 :(得分:1)
该错误意味着在这里:
patch :update, id: (at)line_item, line_item: { product_id: (at)line_item.product_id }
(at)line_item为零。所以这意味着您可能在创建方法或更新方法中有错误(您没有获得正确的line_item)
答案 1 :(得分:1)
我已经检查了书中的实际示例,现在将发布答案,以便其他人可以看到它。如果您要进行测试是update
操作,您应该首先进行更新。这就是为什么书中的测试和任何其他现实测试都有setup
方法来预先创建测试项目的原因:
setup do
@line_item = line_items(:one)
end