Con*_*ion 15 ruby hash matcher 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
Run Code Online (Sandbox Code Playgroud)
这通常会失败,因为具有相同键值对的不同哈希可能会以不同的顺序返回它们的对.结果如下:
Failure/Error: subject.some_method_that_should_generate_the_hash.should == expected
expected: {:foo => 1, 'baz' => 2},
got: {'baz' => 2, :foo => 1}
Run Code Online (Sandbox Code Playgroud)
对于数组,使用=〜运算符求解.但是,这对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
Run Code Online (Sandbox Code Playgroud)
但这似乎不必要地冗长.我希望有一个明显的解决方案.我是否忽略了文档中的某些内容,或者RSpec没有适当的Matcher来进行无序的Hash平等?
zet*_*tic 18
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
Run Code Online (Sandbox Code Playgroud)
通行证.我不确定你的具体情况是怎么回事.你有一些可以分享的失败例子吗?
编程Ruby有这样的说法:
等式 - 如果两个哈希值具有相同的默认值,则它们相等,它们包含相同数量的键,并且第一个哈希值中与每个键对应的值相等(使用==)到第二个哈希值中相同键的值.
从8个月开始,gem rspec-matchers就支持匹配哈希:
expected.should be_hash_matching(subhash_or_equal)
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅此处:https://github.com/rspec/rspec-expectations/pull/79
我相信eql?方法只检查两个哈希值是否具有相同的内容 所以在 Rspec2 中的 IIRC 你可以这样做:
expected = {:foo => 1, 'baz' => 2}
expected.should be_eql({'baz' => 2, :foo => 1})
Run Code Online (Sandbox Code Playgroud)
并且测试应该通过