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

fea*_*ool 16 ruby ruby-on-rails rspec2

请考虑以下RSpec片段:

it "should match" do
  {:a => 1, :b => 2}.should =~ {"a" => 1, "b" => 2}
end
Run Code Online (Sandbox Code Playgroud)

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

在我编写自己的匹配器或强制两个哈希来获得字符串键之前,是否存在处理此(常见)案例的匹配器或技术?

Sha*_*uli 18

你可以这样做:

it "should match" do
    {:a => 1, :b => 2}.stringify_keys.should =~ {"a" => 1, "b" => 2}
end
Run Code Online (Sandbox Code Playgroud)

  • 如果您有嵌套属性,也可以使用“#deep_stringify_keys” (3认同)

yac*_*acc 11

假设您可以访问Rails的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
Run Code Online (Sandbox Code Playgroud)

注意:确保with_indifferent_access在带有符号键的哈希上使用