19

考虑以下 RSpec 片段:

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

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

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

4

4 回答 4

24

你可以这样做:

it "should match" do
    {:a => 1, :b => 2}.stringify_keys.should =~ {"a" => 1, "b" => 2}
end
于 2012-08-06T17:39:44.480 回答
13

假设您可以访问Rails 的 ActiveSupport。您可以利用 with_indifferent_access来匹配两个哈希。下面是 hashrocket Ruby 语法和 Rspec 期望语法的示例:

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在带有符号键的散列上使用

于 2015-09-30T20:07:12.393 回答
1

最简单的方法是编写它以使其与您得到的东西相匹配,例如如果您获得字符串则放入字符串,或者如果您获得符号则放入符号。

如果你不能这样做,我会做的是:

it "should match" do
  {:a => 1}.with_indifferent_access.should =~ {'a' => 1}.with_indifferent_access
end
于 2012-08-06T17:28:45.580 回答
0

我从来没有听说过,但你可以看看在HashWithIndifferentAccessrails 中解决这个问题的 active_supports:http: //apidock.com/rails/ActiveSupport/HashWithIndifferentAccess

于 2012-08-06T17:24:00.673 回答