第三步 安装autotest
在命令行中执行如下命令:
$ sudo gem install ZenTest $ sudo gem install autotest-rails
然后设置与RSpec的集成,在rails应用的目录下,运行如下的命令,就可以显示测试用例的运行结果。
RSPEC=true autotest or autospec
在自己的home目录下,增加一个.autotest设置所有的Rails应用的autotest插件。当然,也可以把这个文件加到每个应用的根目录下,这个文件将覆盖home目录下的文件设置。autotest的插件很多,笔者用到如下的plugin:
$ sudo gem install autotest-growl $ sudo gem install autotest-fsevent $ sudo gem install redgreen
设置.autotest文件,在.autotest中,加入如下代码。
require 'autotest/growl'
require 'autotest/fsevent'
require 'redgreen/autotest'
Autotest.add_hook :initialize do |autotest|
%w{.git .svn .hg .DS_Store ._* vendor tmp log doc}.each do |exception|
autotest.add_exception(exception)
end
end
测试经验
安装了必要的程序库以后,就可以写测试代码了。本例中,所有应用都是在Rails 2.3.4上开发的,RSpec采用的是1.3.0的版本。为了很好的说明问题,我们假定这样的需求:判断一个用户在一个时间段内是否迟到。写测试代码时都是遵循一个原则,只关心输入和输出,具体的实现并不在测试代码的考虑范围之内,是行为驱动开发。根据这个需求,我们将会设计方法absence_at(start_time,end_time),有两个输入值start_time和end_time以及一个输出值,类型是boolean。对应的测试代码如下:
describe "User absence or not during [start_time,end_time]" do before :each do @user = Factory(:user) end it "should return false when user not absence " do start_time = Time.utc(2010,11,9,12,0,0,0) end_time = Time.utc(2010,11,9,12,30,0) @user.absence_at(start_time,end_time).should be_false end it "should return true when user absence " do start_time = Time.utc(2010,11,9,13,0,0,0) end_time = Time.utc(2010,11,9,13,30,0) @user.absence_at(start_time,end_time).should be_ture end end
测试代码已经完成。至于absence_at方法我们并不关心它的实现,只要这个方法的结果能让测试代码运行结果正确就可以。在此测试代码的基础上,就可以大胆地去完成代码,并根据测试代码的结果不断修改代码直到所有测试用例通过。
Stub的使用
写测试代码,最好首先从model开始。因为model的方法能很好与输入输出的原则吻合,容易上手。最初的时候,你会发现mock和stub很好用,任何的对象都可以mock,并且在它的基础上可以stub一些方法,省去构造数据的麻烦,一度让笔者觉得测试代码是如此美丽,一步步的深入,才发现自己陷入了stub的误区。还是引用上面的例子,我们的代码实现如下:










