RSpec should_receive(:send).with(...):有色差异

时间:2015-06-16 05:52:33

标签: ruby unit-testing testing rspec

我大量使用RSpecs 2.13 should_receive(:send).with(...)功能。我知道它是一个过时的版本,但我必须将它用于一个项目(并且测试套件非常庞大)。

当规范失败时,我得到一个像这样的差异输出:

<FooBar (class)> received :send with unexpected arguments
         expected: ({ :foo => bar, :test => "hello"})
         got: ({ :foo => bar, :test => "Hello"})

以上论点都只是样本。我的问题是,如果传递给:send的哈希真的很长,那么很难弄清楚出了什么问题。我启用了RSpec的彩色输出,但这只是将失败的测试用红色着色。

  

有没有办法为should_receive获得彩色差异输出?

前段时间,我编写了自己的匹配器be_matching,它具有彩色差异输出:

RSpec::Matchers.define :be_matching do |expected|
  match do |actual|
    actual == expected
  end

  failure_message_for_should do |actual|
    difference = DiffMatcher::Difference.new(expected, actual, :color_enabled=>RSpec::configuration.color_enabled?)
    difference.to_s
  end
end

但重写所有使用should_receive语法的测试来使用自定义匹配器会有很多工作。

有没有办法,无论是内置,宝石,还是重新定义should_receive的方式,以便为失败的测试提供一些彩色差异输出?

修改

我找到了一种解决方法,可以获得更好的差异输出。您可以使用以下块来调用should_receive

  FooBar.should_receive(:send) do |arg1|
    arg1.should == {}
  end.and_return(true)

但是,没有块的彩色差异输出将是有用的。

1 个答案:

答案 0 :(得分:0)

我相信Rspec将通过defualt为数组提供更好的diff输出。我不记得确切的语法,但例如,像

expected: [a, b, c]
got:      [a, d]
diff: - [b]
        [c]
      + [d]

根据您的具体情况,您可以将哈希转换为数组以使用它。

myHash.map{ |key, value| value}

myHash.values