定义具有随元数据变化的实现的自定义rspec匹配器

时间:2015-08-12 14:33:50

标签: rspec

使用Rspec 3.3我希望有一个匹配器具有不同的实现,具体取决于示例的元数据(实际上它是根据rspec-rails的示例的:type

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

例如,我可以:

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

FYI / FWIW,匹配器将have_link_to预期expected_href,然后实现取决于它是否是功能/请求/控制器/邮件程序 - 我已设法解决此问题,但我想看看是否有更好的方法来定义“多态匹配器”。

1 个答案:

答案 0 :(得分:1)

这已经有一段时间了但是(可能是非常不受支持的)这样做的方式将是

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

这利用了DSL如何将method_missing转发到执行上下文。