再次注意,Rails 已經為您創(chuàng)建了測試用例?蚣懿粌H為這個簡單的小程序生成了視圖和控制器,而且還生成了有助于測試用戶界面的功能性測試。
對 Rails 應用程序進行單元測試
現(xiàn)在是運行一些測試的時候了。請看第一個測試,它已經在 test/unit/trail_test.rb 中寫好了:
清單 8. 第一個測試
require File.dirname(__FILE__) + '/../test_helper'
class TrailTest < Test::Unit::TestCase
fixtures :trails
# Replace this with your real tests.
def test_truth
assert true
end
end
確實,這個測試用例算不了什么,但您可以從中看出如何構架測試代碼,而且自己的測試用例的模板也已經位。請運行測試,如清單 9 所示(包括結果):
清單 9. 運行第一個測試
> ruby test/unit/trail_test.rb
Loaded suite test/unit/trail_test
Started
EE
Finished in 0.027314 seconds.
1) Error:
test_truth(TrailTest):
ActiveRecord::StatementInvalid: Mysql::Error: #42S02Table
'trails_test.trails' doesn't exist: DELETE FROM trails
...results deleted...
測試用例失敗,但是請看輸出。第一行執(zhí)行測試。第三行 EE 顯示測試的結果。如果測試用例通過,會得到 “.” 字符。如果測試用例產生錯誤,會看到 E。如果某個斷言不是 true,那么將看到 F。接下來,可以看到所請求的全部測試都將完成,以及完成這些測試需要的時間。后,將看到每個失敗的詳細原因。在這個示例中沒有表,這是有一定原因的,因為在測試數(shù)據(jù)庫中還沒有創(chuàng)建任何表。通過將開發(fā)方案復制到測試環(huán)境,再重新運行測試,可以修復錯誤,如清單 10 所示:
清單 10. 復制方案,重新運行測試
> rake clone_schema_to_test (in /Users/batate/rails/trails)
> ruby test/unit/trail_test.rb
Loaded suite test/unit/trail_test
Started
.
Finished in 0.038578 seconds.
1 tests, 1 assertions, 0 failures, 0 errors
這樣更好。但是測試還是太簡單,所以是構建一個真正的測試用例的時候了。請?zhí)砑酉旅孢@個新測試用例 test_truth,如清單 11 所示:
清單 11. 添加測試用例
def test_truth
assert true
end
def test_new
trails = Trail.find_all
Trail.new do |trail|
trail.name = "Barton Creek"
trail.description = "A little water in the Spring. You'll get wet."
trail.difficulty = "medium"
trail.save
end
bc = Trail.find_by_name("Barton Creek")
assert_equal "medium", bc.difficulty
assert_equal trails.size + 1, Trail.find_all.size
end
這個代碼驚人的緊湊。只需要鍵入上述代碼以及兩個斷言,可以操縱持久模型。這種經濟的投入正是腳本語言在其他環(huán)境中如此流行的原因。測試也是需要經濟投入的地方。
現(xiàn)在可以運行測試用例,您將看到兩個新斷言顯示在測試報告中。使用 Ruby 時,只需保存并編譯測試即可。清單 12 顯示了測試運行的結果:
清單 12. 測試結果
> ruby test/unit/trail_test.rb
Loaded suite test/unit/trail_test
Started
.
Finished in 0.038578 seconds.
1 tests, 1 assertions, 0 failures, 0 errors
bruce-tates-computer:~/rails/trails batate$ ruby test/unit/trail_test.rb
Loaded suite test/unit/trail_test
Started
..
Finished in 0.182043 seconds.
2 tests, 3 assertions, 0 failures, 0 errors
Fixture 和回滾
Java mock 對象