定义一个自定义rspec匹配器,该匹配器的实现随元数据而变化

定义一个自定义rspec匹配器,该匹配器的实现随元数据而变化,rspec,Rspec,使用rspec3.3,我希望有一个匹配器,它根据示例的元数据具有不同的实现(事实上,它是根据rspecrails的示例的:type) 但是,我看不到任何一种方法: 为不同的元数据定义不同的自定义匹配器(使用相同的名称)(就像包含帮助器方法模块一样) 从matcher访问运行示例的元数据(就像访问运行示例的方法一样) 例如,我可以: RSpec::Matchers.define :some_matcher, type: :request do |expected| #implementat

使用rspec3.3,我希望有一个匹配器,它根据示例的元数据具有不同的实现(事实上,它是根据rspecrails的示例的
:type

但是,我看不到任何一种方法:

  • 为不同的元数据定义不同的自定义匹配器(使用相同的名称)(就像包含帮助器方法模块一样)
  • 从matcher访问运行示例的元数据(就像访问运行示例的方法一样)
例如,我可以:

RSpec::Matchers.define :some_matcher, type: :request do |expected|
  #implementation 1
end

RSpec::Matchers.define :some_matcher, type: :feature  do |expected|
  #implementation 2
end
或者

RSpec::Matchers.define :some_matcher do |expected|
  match do |actual|
    case metadata[:type]
       when :request
          #etc
    end
  end
end
仅供参考,matcher应该是
have_link_to
,它期望
expected_href
,然后实现取决于它是否是一个功能/请求/控制器/邮件器——我已经设法解决了这个问题,但想看看是否有更好的方法来定义“多态matcher”。

已经有一段时间了,但是(可能是可笑的不受支持)这样做的方法是

RSpec::Matchers.define :some_matcher do |expected|
  match do |actual|
    case method_missing(:class).metadata[:type]
       when :request
          #etc
    end
  end
end

这充分利用了DSL matchers如何将缺少的方法转发到执行上下文。

我确认这在rspec 3.7中是有效的。不过,如果有一个解释就好了。