首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Ruby on Rails 開發從頭來(二十一):模型測試常見問題排查

     編輯:Java 相關知識

問題現象

按照教材撰寫模型測試時,使用 @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

可能原因分析

  1. Fixture 載入機制變更:舊版 Rails 自動建立 @fixture_name 實例變數,新版可能需透過 assigns 或 fixtures(:products) 存取。
  2. YAML 格式錯誤:縮排使用空格而非 Tab、冒號後缺少空格、特殊字元未轉義。
  3. Fixture 檔案命名不符:檔名必須為 products.yml(複數),模型宣告 fixtures :products(複數 Symbol)。
  4. 測試基底類別差異:Test::Unit::TestCase vs ActiveSupport::TestCase(Rails 2.0+)載入機制不同。
  5. 資料庫結構不匹配:測試資料庫缺少欄位或型別不符,導致 fixture 插入失敗靜默失效。

排查步驟

  1. 確認 test/fixtures/products.yml 格式正確(使用 YAML 驗證工具)
  2. 檢查 test_helper.rb 是否 `require 'active_record/fixtures'`
  3. 在測試中直接印出 puts @products.inspect 觀察實際內容
  4. 嘗試使用 products(:version_control_book) 方法存取(Rails 2.0+ 推薦語法)
  5. 執行 rake db:test:prepare 重建測試資料庫結構

現代 Rails Fixture 存取語法

# 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 與驗證測試。

關鍵教訓

  • Fixture 存取語法隨 Rails 版本演進,優先查閱對應版本文件
  • 測試失敗時先隔離:單獨執行該測試、檢查資料庫實際資料、印出中間變數
  • 善用 rake test:units --trace 觀察完整堆疊追蹤
  • 版本升級時同步更新測試寫法,避免舊語法失效
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved