接下来,需要运行测试。始终通过输入 spec machine_spec.rb 运行测试。清单 2 展示了预料之中的测试失败:
清单 2. 运行空的规范
~/rspec batate$ spec machine_spec.rb
/opt/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require':
no such file to load -- machine (LoadError)
from /opt/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require'
from ./state_machine_spec.rb:1
from ...
在测试驱动开发中,您需要进行增量开发,因此在进行下一次开发前,需要先解决此次测试出现的问题。现在,我将扮演 jerk 开发人员的角色,即只完成满足应用程序运行所需的最少工作量。我将创建一个名为 machine.rb 的空文件,使测试通过。我现在可以以逸待劳,测试通过而我几乎没做任何事情。
继续角色扮演。我现在扮演一个烦躁的测试人员,促使 jerk 开发人员做些实际的工作。我将编码以下规范,需要使用 Machine 类,如清单 3 所示:
清单 3. 初始规范
require 'machine'
describe Machine do
before :each do
@machine = Machine
end
end
该规范描述了目前尚不存在的 Machine 类。describe 方法提供了 RSpec 描述,您将传入测试类的名称和包含实际规范的代码块。通常,测试用例需要执行一定数量的设置工作。在 RSpec 中,将由 before 方法完成这些设置工作。您向 before 方法传递一个可选的标志和一个代码块。代码块中包含设置工作。标志确定 RSpec 执行代码块的频率。默认的标志为 :each,表示 RSpec 将在每次测试之前调用 set up 代码块。您也可以指定 :all,表示 RSpec 在执行所有测试之前只调用一次 before 代码块。您应该始终使用 :each,使各个测试彼此独立。
输入 spec 运行测试,如清单 4 所示:
清单 4. 存在性测试失败
~/rspec batate$ spec machine_spec.rb
./machine_spec.rb:3: uninitialized constant Machine (NameError)
现在,烦躁的测试人员要促使 jerk 开发人员做点什么了 — jerk 开发人员现在需要创建某个类。对我来说,就是修复测试出现的错误。在 machine.rb 中,我输入最少量的代码,如清单 5 所示:
清单 5. 创建初始 Machine 类
class Machine
end
保存文件,然后运行测试。毫无疑问,清单 6 显示的测试报告没有出现错误:
清单 6. 测试 Machine 是否存在
~/rspec batate$ spec machine_spec.rb
Finished in 5.0e-06 seconds
0 examples, 0 failures
文章来源于领测软件测试网 https://www.ltesting.net/