再次注意,Rails 已经为您创建了测试用例。框架不仅为这个简单的小程序生成了视图和控制器,而且还生成了有助于测试用户界面的功能性测试。
对 Rails 应用程序进行单元测试
现在是运行一些测试的时候了。请看第一个测试,它已经在 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...
测试用例失败,但是请看输出。第一行执行测试。第三行 EE 显示测试的结果。如果测试用例通过,会得到 “.” 字符。如果测试用例产生错误,会看到 E。如果某个断言不是 true,那么将看到 F。接下来,可以看到所请求的全部测试都将完成,以及完成这些测试需要的时间。后,将看到每个失败的详细原因。在这个示例中没有表,这是有一定原因的,因为在测试数据库中还没有创建任何表。通过将开发方案复制到测试环境,再重新运行测试,可以修复错误,如清单 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
这样更好。但是测试还是太简单,所以是构建一个真正的测试用例的时候了。请添加下面这个新测试用例 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
这个代码惊人的紧凑。只需要键入上述代码以及两个断言,可以操纵持久模型。这种经济的投入正是脚本语言在其他环境中如此流行的原因。测试也是需要经济投入的地方。
现在可以运行测试用例,您将看到两个新断言显示在测试报告中。使用 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 对象