ruby rspec期望通过排除指定的键来比较两个散列

roejwanj  于 12个月前  发布在  Ruby
关注(0)|答案(2)|浏览(81)

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

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

通过单独排除DOB键来比较上述两个哈希值。

lskq00tm

lskq00tm1#

我不明白你为什么需要这样,但你可以使用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
aamkag61

aamkag612#

我们可以比较两个临时散列,它们的值相同,但键'DOB'(如果存在)被删除,而不是比较两个临时散列,它们的值分别等于H1H2。该值是任意的;我用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
这有一个可取之处,它比我上面提到的两种方法对内存的需求更小。

相关问题