rspec期望通过排除指定键来比较两个哈希

时间:2019-03-29 09:45:15

标签: ruby rspec

是否有任何规范期望通过单独排除指定键来比较两个哈希。

H1 = {'name' => 'XXXXx', 'age' => 29, 'DOB' => 'dd/mm/yyyy'}
H2 = {'name' => 'XXXXX', 'age' => 29, 'DOB' => 'dd/mm/yyyy'}

通过单独排除DOB密钥来比较以上两个哈希。

2 个答案:

答案 0 :(得分:2)

我不明白您为什么需要这么做,但是您可以使用Hash#delete_if

RSpec.describe do
  let(:hash1) { {'name' => 'XXXXX', 'age' => 29, 'DOB' => 'dd/mm/yyyy'} }
  let(:hash2) { {'name' => 'XXXXX', 'age' => 29, 'DOB' => 'dd/mm/yyyy'} }

  it 'should correctly compare two subhashes' do
    expect(hash1.delete_if { |k,_| k == 'DOB' }).to eql(hash2.delete_if { |k,_| k == 'DOB' })
  end
end

如果您想更整洁地expect,可以先转换哈希。

您还可以使用Hash#reject

RSpec.describe do
  it 'should correctly compare two subhashes' do
    hash1 = {'name' => 'XXXXX', 'age' => 29, 'DOB' => 'dd/mm/yyyy'}
    hash2 = {'name' => 'XXXXX', 'age' => 29, 'DOB' => 'dd/mm/yyyy'}
    hash1, hash2 = [hash1, hash2].map { |h| h.reject { |k,_| k == 'DOB' } }

    expect(hash1).to eql(hash2)
  end
end

答案 1 :(得分:1)

除了比较键H1(如果存在)的两个H2'DOB'的临时哈希值之外,还可以比较两个具有关键字'DOB'的临时哈希值具有相同的值。这个值是任意的;我用过nil

expect(H1.merge('DOB'=>nil).to eq(H2.merge('DOB'=>nil)))

另一种方法是:

expect((H1.keys|H2.keys).all? do |k| 
  k=='DOB' || (H1.key?(k) && H2.key?(k) && H1[k]==H2[k])
end.to eq(true)

H1.key?(k) && H2.key?(k)在其中一个哈希值具有值k的键nil而另一个哈希值没有键k的情况下。

与我上面提到的两种方法相比,它具有可赎回的功能,即对内存的要求更适中。

相关问题