我如何测试" dereferenced" lambda传递给一个方法?

时间:2015-02-09 19:51:45

标签: ruby rspec

考虑以下代码:

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

1 个答案:

答案 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