2

我有一个接收块的方法,并将其委托给另一个方法。真的很简单:

def self.build(&block)
  Builder.build(&block)
end

我希望 RSpec (v3) 测试接收到的块是否已传递给新方法。我的测试目前看起来像:

describe ".build" do
  it "delegates to Builder" do
    block = -> {}
    expect(App::Builder).to receive(:build).with(&block)
    described_class.build(&block)
  end
end

但是 RSpec 给了我一个 ArgumentError: `with` 必须至少有一个参数。使用 `no_args` 匹配器来设置不接收参数的期望。有没有办法让 RSpec 期待一个带有特定块的方法调用?

4

1 回答 1

2

您不能使用期望来测试特定块是否通过。您可以通过在其中添加代码来检查代码是否运行,例如:

describe ".build" do
  it "delegates to Builder" do
    block_is = double('block')
    block = -> {
      block_is.run
    }

    expect(App::Builder).to receive(:build).and_yield
    expect(block_is).to receive(:run)

    described_class.build(&block)
  end
end
于 2014-11-21T06:30:10.883 回答