考虑以下RSpec片段:
it "should match" do
{:a => 1, :b => 2}.should =~ {"a" => 1, "b" => 2}
end
此测试失败,因为一个哈希使用符号作为键,另一个使用字符串作为键。在我的例子中,一个哈希是一个解析的JSON对象,另一个是创建该对象的哈希。我希望他们比较平等。
在我编写自己的匹配器或强制两个哈希值来获取字符串键之前,是否有匹配器或技术处理这种(常见)情况?
答案 0 :(得分:16)
你可以这样做:
it "should match" do
{:a => 1, :b => 2}.stringify_keys.should =~ {"a" => 1, "b" => 2}
end
答案 1 :(得分:9)
假设您有权访问Rails's ActiveSupport。
您可以利用with_indifferent_access
来匹配两个哈希值。
下面是使用hashrocket Ruby语法和Rspec expect语法的示例:
it 'matches two hashes' do
hash_1 = {a: 1, b: 2}.with_indifferent_access
hash_2 = {'a' => 1, 'b' => 2}
expect(hash_1).to match(hash_2)
end
注意:确保在带有符号键的哈希值上使用with_indifferent_access
答案 2 :(得分:1)
最简单的方法是编写它以使其与你得到的东西相匹配,比如如果你得到字符串就放置字符串,或者如果你得到符号就放置符号。
如果你不能这样做,我会做的事情就像:
it "should match" do
{:a => 1}.with_indifferent_access.should =~ {'a' => 1}.with_indifferent_access
end
答案 3 :(得分:0)
我从来没有听说过,但你可以看一下在rails中解决这个问题的active_supports HashWithIndifferentAccess
:http://apidock.com/rails/ActiveSupport/HashWithIndifferentAccess