gpt4 book ai didi

ruby - 如何测试 "dereferenced"lambda 是否传递给方法?

转载 作者:太空宇宙 更新时间:2023-11-03 15:59:34 25 4
gpt4 key购买 nike

考虑这段代码:

def thing_incrementer
lambda do
self.foo +=1
save!
end
end

def increment_thing
with_lock &thing_incrementer
end

我如何编写一个测试来测试 thing_incrementer 是否以 with_lock 作为一个 block 传递?如果我只是想测试它是否作为参数传递(没有前导 &),我会这样做:

let(:the_lambda){ lambda{} }
x.stub(:thing_incrementer){ the_lambda }
x.should_receive(:with_lock).with(the_lambda)
x.increment_thing

最佳答案

传递 &thing_incrementer 传递一个作为 block 绑定(bind)到 with_thing 的过程。所以,只需测试一下:

expect(subject).to receive(:with_lock).with(no_args) do |&blk|
expect(blk).to be_a(Proc)
end

如果你想传递一个 lambda 作为参数,那么你不会在它前面加上 & 并且它只会作为一个普通参数传递,但是你必须调用 blk.call(或其他),而不仅仅是屈服于该 block 。

检查您是否收到所需的 lambda:

class Foo
def incrementor
-> {}
end

def increment
with_lock &incrementor
end

def with_lock
yield
end
end

describe "Lock" do
subject { Foo.new }
let(:the_lambda) { -> {} }
before do
expect(subject).to receive(:incrementor).and_return(the_lambda)
end

it "should receive the_lambda from the incrementor" do
expect(subject).to receive(:with_lock).with(no_args) do |&blk|
expect(blk).to eq(the_lambda)
end
subject.increment
end
end

关于ruby - 如何测试 "dereferenced"lambda 是否传递给方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28418082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com