Techioz Blog

rspec は、指定されたキーを除外して 2 つのハッシュを比較することを期待します

概要

指定されたキーのみを除外して2つのハッシュを比較する仕様はありますか。

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

DOB キーのみを除いて、上記 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

期待をより正確にしたい場合は、事前にハッシュを変換できます。

また、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