这是对如何在 Rspec 中创建辅助方法的描述,取自 Rspec 书(第 149 页)。此示例假定有一个名为“set_status”的方法,该方法在创建“Thing”对象时触发。
两组代码都创建了一个新的“Thing”对象,设置状态,然后执行“fancy_stuff”。第一组代码对我来说非常清楚。它触发的“it”语句之一,然后使用选项调用“create_thing”方法。创建一个新的“Thing”对象,并使用“options”属性作为参数调用“set_status”方法。
第二组代码类似。触发“it”语句之一,然后调用“given_thing_with”方法,同时将“:status”哈希分配作为参数传递。在“given_thing_with”方法中,“yield”被触发,以“Thing.new”作为参数。这是我遇到麻烦的地方。当我尝试运行此代码时,我收到“block given to yield”错误。我知道,yield 传递的任何属性都将从调用“given_thing_with”方法的“it”语句返回到管括号中的“事物”。我可以得到新的
我不明白为什么在'yield'命令之后没有在'given_thing_with'方法中调用代码块。换句话说,我无法在该块中编写代码来运行。
在此先感谢您的帮助。
这个问题的其余部分直接引用自 Rspec 书:
describe Thing do
def create_thing(options)
thing = Thing.new
thing.set_status(options[:status])
thing
end
it "should do something when ok" do
thing = create_thing(:status => 'ok')
thing.do_fancy_stuff(1, true, :move => 'left', :obstacles => nil)
...
end
it "should do something else when not so good" do
thing = create_thing(:status => 'not so good')
thing.do_fancy_stuff(1, true, :move => 'left', :obstacles => nil)
...
end
end
您可以应用的一个习惯用法来进一步清理它是从对象中的初始化程序中产生 self 。假设 Thing 的 initialize() 方法执行此操作并且 set_status() 也执行此操作,您可以这样编写前面的内容:
describe Thing do
def given_thing_with(options)
yield Thing.new do |thing|
thing.set_status(options[:status])
end
end
it "should do something when ok" do
given_thing_with(:status => 'ok') do |thing|
thing.do_fancy_stuff(1, true, :move => 'left', :obstacles => nil)
...
end
end
it "should do something else when not so good" do
given_thing_with(:status => 'not so good') do |thing|
thing.do_fancy_stuff(1, true, :move => 'left', :obstacles => nil)
...
end
end
end