考虑以下代码:
def thing_incrementer
lambda do
self.foo +=1
save!
end
end
def increment_thing
with_lock &thing_incrementer
end
如何编写测试,以thing_incrementer
作为块来测试with_lock
?如果我只想测试它是作为参数传递的(没有前导&
)我会这样做:
let(:the_lambda){ lambda{} }
x.stub(:thing_incrementer){ the_lambda }
x.should_receive(:with_lock).with(the_lambda)
x.increment_thing
答案 0 :(得分:2)
传递&thing_incrementer
将一个被绑定为块的proc传递给with_thing
。所以,只需测试一下:
expect(subject).to receive(:with_lock).with(no_args) do |&blk|
expect(blk).to be_a(Proc)
end
如果你想传递一个lambda作为一个参数,那么你不会在它前面添加&
,它只会作为普通参数传递,但是你必须调用{{1} (或其他),而不仅仅是屈服于块。
要检查您是否收到了想要的lambda:
blk.call