【问题标题】:How to write a diffable matcher with Rspec2如何用 Rspec2 编写一个可区分的匹配器
【发布时间】:2012-09-23 10:29:44
【问题描述】:

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

我可以很容易地定义一个匹配器来做这个

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

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

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

【问题讨论】:

  • 如果不匹配,您能否在内部块中添加条件以打印出来?至于打印出哈希,它实际上可能不如原始的有用,因为 RSpec 在打印中没有区分 Hash 和 OrderedHash,详见此处stackoverflow.com/questions/4728805/…

标签: ruby rspec2


【解决方案1】:

对于 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 表示不应该直接使用。

【讨论】:

    【解决方案2】:

    使用failure_message_for_should 块:-

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

    然后.to_hash你需要看什么。

    【讨论】:

    • 谢谢,但这无济于事的问题不是如何编写我自己的失败消息,而是如何重用 rspec。 Rspec 实际上有很好的差异,但不是我想要的对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 2011-12-03
    相关资源
    最近更新 更多