使用RSpec Mocks测试块是否通过

时间:2014-12-02 07:31:17

标签: ruby rspec rspec3

我可以测试参数是否传递如下:

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

3 个答案:

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