Примечание для будущих читателей: думаете, что 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 надлежащего совпадения для беззаботного равенства Хэша?