我可以测试参数是否传递如下:
RSpec.describe do
it do
obj = double
expect(obj).to receive(:method).with(1, 2, 3)
obj.method(1, 2, 3)
end
end
我该如何处理块参数?我理想的代码:
RSpec.describe do
it do
obj = double
proc = Proc.new{}
expect(obj).to receive(:method).with(1, 2, 3).with_block(proc)
obj.method(1, 2, 3, &proc)
end
end
答案 0 :(得分:7)
似乎我不能简单地测试是否通过方法链接传递了一个块。我找到了一个沉闷的答案,Block Implementation:
RSpec.describe do
it do
obj = double
proc = Proc.new{}
expect(obj).to receive(:method).with(1, 2, 3) do |*args, &block|
expect(proc).to be(block)
end
obj.method(1, 2, 3, &proc)
end
end
但是,我们不能同时使用块实现和其他响应配置方法,如receive(:method).with(1, 2, 3){|*| ...}.and_call_original
。
答案 1 :(得分:1)
根据上面的git票证,您可以通过
执行此操作expect(object)
.to receive(:method)
.with(param1, param2) do |&block|
expect(block).to be('my block contents')
end
.and_call_original
将验证参数的传递并评估块内容。然后,您可以在之后链接.and_mock_original
或.and_call_original
等。
答案 2 :(得分:0)
您无法使用期望来测试是否传递了特定块。您可以通过在其中添加代码来检查代码是否已运行,例如:
RSpec.describe do
it do
obj = double
block_is = double('block')
block = -> {
block_is.run
}
expect(obj).to receive(:method).with(1, 2, 3).and_yield
expect(block_is).to receive(:run)
obj.method(1, 2, 3, &block)
end
end