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

Ruby on Rails 開發從頭來(十九):單元測試啟動與 Fixture 資料載入

     編輯:Java 相關知識

測試目錄結構

test/
├── unit/           # 模型測試
├── functional/     # 控制器測試
├── integration/    # 整合測試
├── fixtures/       # YAML 測試資料
└── mocks/          # 模擬物件

第一支測試

# test/unit/product_test.rb
require File.dirname(__FILE__) + '/../test_helper'

class ProductTest < Test::Unit::TestCase
  fixtures :products
  
  def setup
    @product = Product.find(1)
  end
  
  def test_truth
    assert true
  end
end

執行測試遇到錯誤

depot> ruby test/unit/product_test.rb
Loaded suite test/unit/product_test
Started E
Finished in 0.312 seconds.
1) Error:
test_truth(ProductTest): ActiveRecord::StatementInvalid: Mysql::Error: Table 'depot_test.products' doesn't exist: DELETE FROM products

測試資料庫 depot_test 缺少 products 表。

建立測試資料庫結構

depot> rake clone_structure_to_test

將開發資料庫結構複製到測試資料庫,完成後 depot_test 擁有所有表格。

定義 Fixture 測試資料

test/fixtures/products.yml:

# Read about fixtures at https://ar.rubyonrails.org/classes/Fixtures.html
version_control_book:
  id: 1
  title: Pragmatic Version Control
  description: How to use version control
  image_url: https://.../sk_svn_small.jpg
  price: 29.95
  date_available: 2005-01-26 00:00:00

automation_book:
  id: 2
  title: Pragmatic Project Automation
  description: How to automate your project
  image_url: https://.../sk_auto_small.jpg
  price: 29.95
  date_available: 2004-07-01 00:00:00

YAML 格式關鍵

  • 鍵值對用 : 分隔,冒號後必須有一個空格
  • 縮排使用空格(2 或 4 格),不可用 Tab
  • 字串無需引號,但含特殊字元時建議加引號
  • ERB 標籤 `<% %>` 可動態產生內容

再次執行測試

depot> ruby test/unit/product_test.rb
Loaded suite test/unit/product_test
Started .
Finished in 0.063 seconds.
1 tests, 1 assertions, 0 failures, 0 errors

測試通過,資料庫 products 表自動插入兩筆 fixture 資料。

Fixture 機制說明

  • 測試類別宣告 fixtures :products → 載入 products.yml
  • 每個測試方法執行前:DELETE FROM products → INSERT fixtures
  • 測試方法執行後:交易回滾(若啟用 use_transactional_fixtures)或下一輪前清理
  • Fixture 名稱(如 version_control_book)可在測試中透過存取方法取得物件
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved