我有一个将代码块作为参数的方法。问题是:如果这个方法调用了块,如何使用 RSpec 进行测试?
可以在方法需要的任何范围内评估该块,不一定使用 ayield
或block.call
。它被传递给另一个类,或者在匿名类对象或其他地方对其进行评估。为了使测试通过,作为方法调用的结果,在某处评估块就足够了。
有没有办法使用 RSpec 来测试这样的东西?
另请参阅this以了解更复杂的情况lets
和模拟。
我喜欢使用throw
而不是raise
解决这类问题,因为它不能被任意救援处理程序救援。所以它可能看起来像这样:
my_proc = proc { throw :my_proc_was_called }
expect {
my_proc.call
}.to throw_symbol :my_proc_was_called
我通常会做类似的事情
a = 1
b.go { a = 2}
a.should == 2
感谢戴夫牛顿在上面评论中的建议,我做了这样的事情:
it "should run block defining the node" do
message="This message is raised if block is properly evaluated."
expect do
node do
raise message
end
end.to raise_error message
end
如果出现错误,则会打印消息:
Failure/Error: expect do
expected Exception with "This message is raised if block is properly evaluated." but nothing was raised
我觉得信息量足够大。
再次感谢您的帮助!