RSpec:将哈希与字符串键与带符号键的哈希进行比较?

时间:2012-08-06 17:17:28

标签: ruby-on-rails ruby rspec2

考虑以下RSpec片段:

it "should match" do
  {:a => 1, :b => 2}.should =~ {"a" => 1, "b" => 2}
end

此测试失败,因为一个哈希使用符号作为键,另一个使用字符串作为键。在我的例子中,一个哈希是一个解析的JSON对象,另一个是创建该对象的哈希。我希望他们比较平等。

在我编写自己的匹配器或强制两个哈希值来获取字符串键之前,是否有匹配器或技术处理这种(常见)情况?

4 个答案:

答案 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 HashWithIndifferentAccesshttp://apidock.com/rails/ActiveSupport/HashWithIndifferentAccess