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