如何用Rspec2编写一个diffable匹配器

时间:2012-09-23 10:29:45

标签: ruby rspec2

我正在尝试编写一个匹配器,在将对象转换为Hash之前将其转换为Hash,然后再与预期值进行比较(假设我想比较2个哈希,而不关心键是字符串或符号这一事实。)

我可以轻松定义匹配器

RSpec::Matchers.define :my_matcher do |content|
    match { |to_match| my_hash_conversion(to_match) == my_hash_conversion(content)
    diffable
end

我添加diffable,因此当两个对象不匹配时,rspec会显示两个对象的差异。 但是我想显示转换对象的diff而不是原始对象的diff?

我看到他们在Rspec的某个地方有一个Differ类和一个diff_with_hash函数,但我不知道如何使用它(因为它没有真正记录)。

2 个答案:

答案 0 :(得分:0)

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

RSpec::Matchers.define :my_matcher do |expected|
  expected_hash = my_hash_conversion(expected)
  match do |actual|
    actual_hash = my_hash_conversion(actual)
    expected_hash == actual_hash
  end

  failure_message do |actual|
    actual_hash = my_hash_conversion(actual)
    "expect #{expected_hash} to match #{actual_hash}" + 
      RSpec::Support::Differ.new.diff(actual_hash, expected_hash)
  end
end

注意:RSpec::Support表示不应该直接使用它。

答案 1 :(得分:-1)

使用failure_message_for_should阻止: -

failure_message_for_should do |actual|
  "expected: #{expected} \n     got: #{actual}"
end

然后.to_hash您需要查看的内容。