自定义RSpec匹配器占用一个块

Tim*_*ott 5 ruby rspec

如何创建以下RSpec匹配器?

foo.bars.should incude_at_least_one {|bar| bar.id == 42 }
Run Code Online (Sandbox Code Playgroud)

让我知道如果我重新发明轮子,但我也很想知道如何创建一个自定义匹配器.一些内置的匹配器可以做到,所以它是可能的.我试过这个:

RSpec::Matchers.define :incude_at_least_one do |expected|
  match do |actual|
    actual.each do |item|
      return true if yield(item)
    end
    false
  end
end
Run Code Online (Sandbox Code Playgroud)

我也尝试过&block两个人.我想念一些简单的东西.

Mic*_*ile 0

关于将这样的匹配器添加到 rspec 中已经存在讨论。我不确定你的块问题,但你可以用不那么优雅的外观来表示这个测试:

foo.bars.any?{|bar| bar.id == 42}.should be_true
Run Code Online (Sandbox Code Playgroud)

可能比制作自定义匹配器更容易,并且如果您的测试类似于it "should include at least one foo matching the id"