Существует ли средство согласования RSpec2 для сопоставления хэшей?

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

15
задан Confusion 19 January 2011 в 06:10
поделиться