gpt4 book ai didi

ruby - 测试一个方法是否需要一个 block

转载 作者:太空宇宙 更新时间:2023-11-03 18:05:45 26 4
gpt4 key购买 nike

我如何验证 Foobar#some_method 是否占用了一个 block 。类似于 Foobar.new.respond_to?(:some_method)

class Foobar
def some_method
yield
end
end

为什么?

这对于测试合约接口(interface)很有用。确保我 stub 的方法具有未更改的 API。

我尝试过的方法

mth = Foobar.new.method(:some_method)
mth.parameters

这会返回一个参数列表(Rspec 本质上使用的)。如果我有一个像这样的 block 参数,它会起作用:

def some_method(&blk)
end

但是如果一个方法使用 yield 代替,我从 #parameters 中什么也得不到。

这是为了添加规范以确保与丑陋的外部世界的接口(interface)。所以我知道一个方法是怎么用的。但如果有 API 更改,我希望规范失败。

最佳答案

How can I verify if Foobar#some_method takes a block.

ruby 中的每个 方法都需要(可以使用)一个 block 。它可能只是选择不屈服。所以我认为这就是您需要检查的内容:该方法是否成功。

RSpec 有许多产量预期:https://relishapp.com/rspec/rspec-expectations/docs/built-in-matchers/yield-matchers

RSpec.describe "yield_control matcher" do
specify { expect { |b| MyClass.yield_once_with(1, &b) }.to yield_control }
specify { expect { |b| MyClass.dont_yield(&b) }.not_to yield_control }
specify { expect { |b| MyClass.yield_twice_with(1, &b) }.to yield_control.twice }
specify { expect { |b| MyClass.yield_twice_with(1, &b) }.to yield_control.exactly(2).times }
specify { expect { |b| MyClass.yield_twice_with(1, &b) }.to yield_control.at_least(1) }
specify { expect { |b| MyClass.yield_twice_with(1, &b) }.to yield_control.at_most(3).times }

end

所以对于你的情况,它应该是这样的:

expect{ foobar.some_method }.to yield_control

关于ruby - 测试一个方法是否需要一个 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46307558/

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