按照教材撰寫模型測試時,使用 @products["version_control_book"] 存取 fixture 物件總是回傳 nil,導致 NoMethodError: You have a nil object when you didn't expect it!。
def test_read_with_hash
assert_kind_of Product, @product
vc_book = @products["version_control_book"] # 這裡回傳 nil
assert_equal vc_book["id"], @product.id
# ...
end
@fixture_name 實例變數,新版可能需透過 assigns 或 fixtures(:products) 存取。products.yml(複數),模型宣告 fixtures :products(複數 Symbol)。Test::Unit::TestCase vs ActiveSupport::TestCase(Rails 2.0+)載入機制不同。test/fixtures/products.yml 格式正確(使用 YAML 驗證工具)test_helper.rb 是否 `require 'active_record/fixtures'`puts @products.inspect 觀察實際內容products(:version_control_book) 方法存取(Rails 2.0+ 推薦語法)rake db:test:prepare 重建測試資料庫結構# Rails 2.0+ 自動產生存取方法
def test_read_with_fixture_method
vc_book = products(:version_control_book) # 推薦方式
assert_equal vc_book.id, @product.id
assert_equal vc_book.title, @product.title
# ...
end
# 或者使用 assigns (功能測試中)
products = assigns(:products) # 陣列
vc_book = products.find { |p| p.title == "Pragmatic Version Control" }
見原文件附件,包含 test_create、test_update、test_destroy、test_validate 等 CRUD 與驗證測試。
rake test:units --trace 觀察完整堆疊追蹤