Примечание для будущих читателей: думаете, что RSpec не считает ваши хэши равными? Один из них может быть OrderedHash, но по обычному выводу RSpec этого не скажешь. Это была проблема, из-за которой возник этот пост.
Исходный вопрос:
Предположим, у меня есть спецификация, в которой я хочу проверить, генерирует ли метод соответствующий хэш.
it 'should generate the Hash correctly' do
expected = {:foo => 1, 'baz' => 2}
subject.some_method_that_should_generate_the_hash.should == expected
end
Это часто не удается, потому что разные хеши с одинаковыми парами ключ-значение могут возвращать свои пары в другом порядке. Результаты выглядят так:
Failure/Error: subject.some_method_that_should_generate_the_hash.should == expected
expected: {:foo => 1, 'baz' => 2},
got: {'baz' => 2, :foo => 1}
Для массивов это решается с помощью оператора = ~. Однако это не работает для хэшей. На данный момент я обратился к
it 'should generate the Hash correctly' do
expected = {:foo => 1, 'baz' => 2}
subject.some_method_that_should_generate_the_hash.each {|k,v|
v.should == expected[k]
}
end
, но это кажется излишне многословным. Я ожидаю, что для этого будет очевидное решение. Я что-то упускаю из виду в документации или в RSpec нет подходящего сопоставителя для беспорядочного равенства хэшей?