再次注意,Rails 已經(jīng)為您創(chuàng)建了測(cè)試用例?蚣懿粌H為這個(gè)簡(jiǎn)單的小程序生成了視圖和控制器,而且還生成了有助于測(cè)試用戶界面的功能性測(cè)試。
對(duì) Rails 應(yīng)用程序進(jìn)行單元測(cè)試
現(xiàn)在是運(yùn)行一些測(cè)試的時(shí)候了。請(qǐng)看第一個(gè)測(cè)試,它已經(jīng)在 test/unit/trail_test.rb 中寫好了:
清單 8. 第一個(gè)測(cè)試
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
確實(shí),這個(gè)測(cè)試用例算不了什么,但您可以從中看出如何構(gòu)架測(cè)試代碼,而且自己的測(cè)試用例的模板也已經(jīng)位。請(qǐng)運(yùn)行測(cè)試,如清單 9 所示(包括結(jié)果):
清單 9. 運(yùn)行第一個(gè)測(cè)試
> 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...
測(cè)試用例失敗,但是請(qǐng)看輸出。第一行執(zhí)行測(cè)試。第三行 EE 顯示測(cè)試的結(jié)果。如果測(cè)試用例通過,會(huì)得到 “.” 字符。如果測(cè)試用例產(chǎn)生錯(cuò)誤,會(huì)看到 E。如果某個(gè)斷言不是 true,那么將看到 F。接下來,可以看到所請(qǐng)求的全部測(cè)試都將完成,以及完成這些測(cè)試需要的時(shí)間。后,將看到每個(gè)失敗的詳細(xì)原因。在這個(gè)示例中沒有表,這是有一定原因的,因?yàn)樵跍y(cè)試數(shù)據(jù)庫中還沒有創(chuàng)建任何表。通過將開發(fā)方案復(fù)制到測(cè)試環(huán)境,再重新運(yùn)行測(cè)試,可以修復(fù)錯(cuò)誤,如清單 10 所示:
清單 10. 復(fù)制方案,重新運(yùn)行測(cè)試
> 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
這樣更好。但是測(cè)試還是太簡(jiǎn)單,所以是構(gòu)建一個(gè)真正的測(cè)試用例的時(shí)候了。請(qǐng)?zhí)砑酉旅孢@個(gè)新測(cè)試用例 test_truth,如清單 11 所示:
清單 11. 添加測(cè)試用例
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
這個(gè)代碼驚人的緊湊。只需要鍵入上述代碼以及兩個(gè)斷言,可以操縱持久模型。這種經(jīng)濟(jì)的投入正是腳本語言在其他環(huán)境中如此流行的原因。測(cè)試也是需要經(jīng)濟(jì)投入的地方。
現(xiàn)在可以運(yùn)行測(cè)試用例,您將看到兩個(gè)新斷言顯示在測(cè)試報(bào)告中。使用 Ruby 時(shí),只需保存并編譯測(cè)試即可。清單 12 顯示了測(cè)試運(yùn)行的結(jié)果:
清單 12. 測(cè)試結(jié)果
> 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 對(duì)象