Ответ 1
Вы можете сделать:
it "should match" do
{:a => 1, :b => 2}.stringify_keys.should =~ {"a" => 1, "b" => 2}
end
Рассмотрим следующий фрагмент RSpec:
it "should match" do
{:a => 1, :b => 2}.should =~ {"a" => 1, "b" => 2}
end
Этот тест терпит неудачу, потому что один хэш использует символы для ключей, а другой использует строки для ключей. В моем случае один хеш - это анализируемый объект JSON, другой - хэш, создавший объект. Я бы хотел, чтобы они сравнивались как равные.
Прежде чем я напишу свой собственный ответчик или принуждение обоих хэшей к строковым клавишам, есть ли метод или метод, который обрабатывает этот (общий) случай?
Вы можете сделать:
it "should match" do
{:a => 1, :b => 2}.stringify_keys.should =~ {"a" => 1, "b" => 2}
end
Предполагая, что у вас есть доступ к 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
в хэше с символьными клавишами
я никогда не слышал об одном, но вы могли бы посмотреть на active_supports HashWithIndifferentAccess
, который решает эту проблему в rails: http://apidock.com/rails/ActiveSupport/HashWithIndifferentAccess
Самый простой способ - написать его так, чтобы он соответствовал тому, что вы получаете, например, поместить строки, если вы получаете строки, или помещать символы, если вы получаете символы.
Если вы не можете этого сделать, то я бы сделал что-то вроде:
it "should match" do
{:a => 1}.with_indifferent_access.should =~ {'a' => 1}.with_indifferent_access
end