Ruby 如何用Rspec2编写可扩散匹配器

Ruby 如何用Rspec2编写可扩散匹配器,ruby,rspec2,Ruby,Rspec2,我试图编写一个匹配器,在比较预期值之前将对象转换为散列,比如说,我想比较两个散列,而不考虑键是字符串或符号这一事实 我可以很容易地定义一个匹配器来执行此操作 RSpec::Matchers.define :my_matcher do |content| match { |to_match| my_hash_conversion(to_match) == my_hash_conversion(content) diffable end 我添加了diffable,因此当两个对象不匹

我试图编写一个匹配器,在比较预期值之前将对象转换为散列,比如说,我想比较两个散列,而不考虑键是字符串或符号这一事实

我可以很容易地定义一个匹配器来执行此操作

RSpec::Matchers.define :my_matcher do |content|
    match { |to_match| my_hash_conversion(to_match) == my_hash_conversion(content)
    diffable
end
我添加了diffable,因此当两个对象不匹配时,rspec会显示它们的diff。 但是,我想显示转换对象的差异,而不是原始对象的差异

我看到它们在Rspec中的某个地方,有一个不同的类和一个带有散列函数的diff_,但我不知道如何使用它,因为它并没有真正的文档记录。

使用failure_message_for_应该阻止:-

然后。要对需要查看的内容进行散列。

使用失败消息\u for\u应阻止:-


然后。要散列您需要查看的内容。

对于RSpec3,您可以直接使用Diff类

RSpec::Matchers.define:my_matcher do |预期| expected\u hash=my\u hash\u conversionexpected 匹配do |实际值| 实际\u哈希=我的\u哈希\u转换实际 预期的\u散列==实际的\u散列 终止 故障消息do |实际| 实际\u哈希=我的\u哈希\u转换实际 期望{expected_hash}匹配{actual_hash}+ RSpec::Support::difference.new.diffactual\u散列,应为\u散列 终止 终止
注意:RSpec::Support说它不应该直接使用。

对于RSpec3,您可以直接使用Diff类

RSpec::Matchers.define:my_matcher do |预期| expected\u hash=my\u hash\u conversionexpected 匹配do |实际值| 实际\u哈希=我的\u哈希\u转换实际 预期的\u散列==实际的\u散列 终止 故障消息do |实际| 实际\u哈希=我的\u哈希\u转换实际 期望{expected_hash}匹配{actual_hash}+ RSpec::Support::difference.new.diffactual\u散列,应为\u散列 终止 终止
注意:RSpec::Support表示不应直接使用它。

如果不匹配,是否可以向内部块添加条件以打印输出?至于打印出散列,由于RSpec在打印时没有像这里详述的那样区分散列和OrderedHash,因此它实际上可能没有原始散列有用。如果不匹配,您能否向内部块添加一个条件以打印出?至于打印出散列,它实际上可能没有原来的有用,因为RSpec在打印时没有像这里详细说明的那样区分散列和OrderedHash。谢谢,但这没有帮助。问题不是如何编写我自己的失败消息,而是如何重用RSpec消息。Rspec实际上有很好的区别,但不是在我想要的对象上。谢谢,但这没有帮助。问题不是如何编写自己的失败消息,而是如何重用Rspec消息。Rspec实际上是一个很好的差异,但不是在我想要的对象上。
failure_message_for_should do |actual|
  "expected: #{expected} \n     got: #{actual}"
end