или в rspec 3,

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

Ответы на вопрос(3)

Решение Вопроса
describe 'Hash' do
  let(:x) { { :a => 1, :b => 2 } }
  let(:y) { { :b => 2, :a => 1 } }

  it "should be equal with ==" do
    x.should == y
  end
end

что происходит в вашем конкретном случае. У вас есть несколько неудачных примеров, которыми вы можете поделиться?

Программирование в Ruby имеет следующее:

Равенство - два хеша равны, если они имеют одинаковое значение по умолчанию, они содержат одинаковое количество ключей, а значение, соответствующее каждому ключу в первом хеш-коде, равно (используя ==) значению для того же ключа во втором ,

 zetetic19 янв. 2011 г., 08:33
Интересно. Таким образом, OrderedHash и Hash с одинаковыми парами ключ / значение не считаются равными - это хорошо знать.
 Confusion19 янв. 2011 г., 07:08
Вчера поздно я обнаружил проблему: на самом деле я не сравнивал два хэша: один где-то по пути превратился в OrderedHash. Вы не можете взглянуть на это из вывода RSpec, и мне немного стыдно сказать, что это был не первый раз, когда я попал в эту ловушку: /

С 8 месяцев жемчужинаrspec-matchers имеет поддержку для сопоставления хэшей:

expected.should be_hash_matching(subhash_or_equal)

смотрите здесь для более подробной информации:https://github.com/rspec/rspec-expectations/pull/79

 nruth27 апр. 2016 г., 18:18
кажется, это было удалено в rspec 3, но.to eql(x) работает

что EQL? Метод проверяет только то, что два хеша имеют одинаковое содержимое. Итак, IIRC в Rspec2 вы можете сделать:

    expected = {:foo => 1, 'baz' => 2}
    expected.should be_eql({'baz' => 2, :foo => 1})

И тест должен пройти

 nruth27 апр. 2016 г., 18:18
или в rspec 3,expect(x).to eql(y)

Ваш ответ на вопрос