rspec ожидайте сравнить два хэша, исключая указанные ключи - PullRequest
1 голос
/ 29 марта 2019

Ожидаются ли какие-либо спецификации, в которых сравниваются два хэша, исключая только указанные ключи.

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

Сравните два вышеупомянутых хэша, исключив только ключ DOB.

Ответы [ 2 ]

2 голосов
/ 29 марта 2019

Я не понимаю, зачем вам это нужно, но вы можете использовать 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 голос
/ 29 марта 2019

Вместо сравнения двух временных хэшей, равных 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.

У этого есть функция выкупа, которая требует более скромных требований к памяти, чем у двух подходов, которые я упомянул выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...