定义支持块期望的匹配器

当您希望使用自定义匹配器支持块期望(例如 expect { ... }.to matcher)时,您必须指定这一点。您可以通过定义 supports_block_expectation? 方法或使用 DSL 的 supports_block_expectations 快捷方法手动(或根据某些逻辑确定性地)执行此操作。

手动定义块匹配器

给定一个名为 “blockmatcherspec.rb” 的文件,其中包含

RSpec::Matchers.define :support_blocks do
  match do |actual|
    actual.is_a? Proc
  end

  def supports_block_expectations?
    true # or some logic
  end
end

RSpec.describe "a custom block matcher" do
  specify { expect { }.to support_blocks }
end

我运行 rspec ./block_matcher_spec.rb

那么示例应该通过。

使用快捷方式定义块匹配器

给定一个名为 “blockmatcherspec.rb” 的文件,其中包含

RSpec::Matchers.define :support_blocks do
  match do |actual|
    actual.is_a? Proc
  end

  supports_block_expectations
end

RSpec.describe "a custom block matcher" do
  specify { expect { }.to support_blocks }
end

我运行 rspec ./block_matcher_spec.rb

那么示例应该通过。

使用快捷方式定义块匹配器

给定一个名为 “blockmatcherspec.rb” 的文件,其中包含

RSpec::Matchers.define :support_blocks_with_errors do
  match(:notify_expectation_failures => true) do |actual|
    actual.call
    true
  end

  supports_block_expectations
end

RSpec.describe "a custom block matcher" do
  specify do
    expect {
      expect(true).to eq false
    }.to support_blocks_with_errors
  end
end

我运行 rspec ./block_matcher_spec.rb

那么它应该失败,提示

Failures:

  1) a custom block matcher is expected to support blocks with errors
     Failure/Error: expect(true).to eq false

       expected: false
            got: true

       (compared using ==)