是否存在匹配哈希的RSpec2匹配器?
未来读者请注意:认为RSpec不认为您的哈希值相等? 一个可能是OrderedHash,但是从常规RSpec输出你无法分辨。 这是提示这篇文章的问题。
原始问题:
假设我有一个规范,我想测试一个方法生成适当的哈希。
it 'should generate the Hash correctly' do expected = {:foo => 1, 'baz' => 2} subject.some_method_that_should_generate_the_hash.should == expected end
这通常会失败,因为具有相同键值对的不同哈希可能会以不同的顺序返回它们的对。 结果如下:
Failure/Error: subject.some_method_that_should_generate_the_hash.should == expected expected: {:foo => 1, 'baz' => 2}, got: {'baz' => 2, :foo => 1}
对于数组,使用=〜运算符求解。 但是,这对Hashes不起作用。 现在,我已经诉诸了
it 'should generate the Hash correctly' do expected = {:foo => 1, 'baz' => 2} subject.some_method_that_should_generate_the_hash.each {|k,v| v.should == expected[k] } end
但这似乎不必要地冗长。 我希望有一个明显的解决方案。 我是否忽略了文档中的某些内容,或者RSpec是否有适当的Matcher无序哈希平等?
describe 'Hash' do let(:x) { { :a => 1, :b => 2 } } let(:y) { { :b => 2, :a => 1 } } it "should be equal with ==" do x.should == y end end
通行证。 我不确定你的具体情况是怎么回事。 你有一些可以分享的失败例子吗?
编程Ruby有这样的说法:
等式 – 如果两个哈希值具有相同的默认值,则它们相等,它们包含相同数量的键,并且第一个哈希值中与每个键对应的值等于(使用==)到第二个哈希值中相同键的值。
从8个月开始,gem rspec-matchers
支持匹配哈希:
expected.should be_hash_matching(subhash_or_equal)
有关详细信息,请参阅此处: https : //github.com/rspec/rspec-expectations/pull/79
我相信eql? 方法只检查两个哈希值是否具有相同的内容所以在Rspec2中你可以做的IIRC:
expected = {:foo => 1, 'baz' => 2} expected.should be_eql({'baz' => 2, :foo => 1})
测试应该通过