Подтвердить что ты не робот

RSpec: сравнение хэша со строковыми ключами против хэша с символьными клавишами?

Рассмотрим следующий фрагмент RSpec:

it "should match" do
  {:a => 1, :b => 2}.should =~ {"a" => 1, "b" => 2}
end

Этот тест терпит неудачу, потому что один хэш использует символы для ключей, а другой использует строки для ключей. В моем случае один хеш - это анализируемый объект JSON, другой - хэш, создавший объект. Я бы хотел, чтобы они сравнивались как равные.

Прежде чем я напишу свой собственный ответчик или принуждение обоих хэшей к строковым клавишам, есть ли метод или метод, который обрабатывает этот (общий) случай?

4b9b3361

Ответ 1

Вы можете сделать:

it "should match" do
    {:a => 1, :b => 2}.stringify_keys.should =~ {"a" => 1, "b" => 2}
end

Ответ 2

Предполагая, что у вас есть доступ к Rails ActiveSupport. Вы можете использовать with_indifferent_access для соответствия обеим хэшам. Ниже приведен пример с синтаксисом Ruby hashrocket и синтаксисом ожидания Rspec:

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

Примечание. Обязательно используйте with_indifferent_access в хэше с символьными клавишами

Ответ 4

Самый простой способ - написать его так, чтобы он соответствовал тому, что вы получаете, например, поместить строки, если вы получаете строки, или помещать символы, если вы получаете символы.

Если вы не можете этого сделать, то я бы сделал что-то вроде:

it "should match" do
  {:a => 1}.with_indifferent_access.should =~ {'a' => 1}.with_indifferent_access
end