Существует ли сопоставитель RSpec2 для сопоставления хэшей? - PullRequest
15 голосов
/ 18 января 2011

Примечание для будущих читателей: думаете, 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 ]

18 голосов
/ 19 января 2011
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 имеет следующее:

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

6 голосов
/ 07 июля 2012

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

expected.should be_hash_matching(subhash_or_equal)

подробности см. Здесь: https://github.com/rspec/rspec-expectations/pull/79

3 голосов
/ 19 января 2011

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

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

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

...