Uwaga dla przyszłych czytelników: czy RSpec uważa, że twoje hashe nie są równe? Jednym z nich może być OrderedHash, ale ze zwykłego wyjścia RSpec nie można powiedzieć. To był problem, który wywołał ten post.Czy istnieje przystawka RSpec2 dla pasujących skrótów?
Oryginalne pytanie:
Załóżmy, że mam spec gdzie chcę przetestować, że metoda generuje odpowiedni Hash.
it 'should generate the Hash correctly' do
expected = {:foo => 1, 'baz' => 2}
subject.some_method_that_should_generate_the_hash.should == expected
end
Często kończy się niepowodzeniem, ponieważ różne hashe z tymi samymi parami klucz-wartość mogą zwracać pary w innym zamówieniu. Wyniki wyglądają następująco:
Failure/Error: subject.some_method_that_should_generate_the_hash.should == expected
expected: {:foo => 1, 'baz' => 2},
got: {'baz' => 2, :foo => 1}
Dla tablic rozwiązuje się to za pomocą operatora = ~. Jednak to nie działa dla Hashe. Na razie odwołałem się do
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
, ale wydaje się to niepotrzebnie pełne. Spodziewam się, że będzie to oczywiste rozwiązanie. Czy mogę przeoczyć coś w dokumentach, czy też RSpec nie ma odpowiedniego Matchera na równość bez skrupułów?
Wczoraj późno znalazłem problem: nie porównywałem dwóch Hashów: jeden z nich zmienił się gdzieś po drodze. Nie można na to spojrzeć z wyjścia RSpec i jestem nieco zakłopotany stwierdzeniem, że nie po raz pierwszy wpadłem w tę pułapkę:/ – Confusion
Interesujące. Tak więc OrderedHash i Hash z tymi samymi parami klucz/wartość nie są uważane za równe - dobrze to wiedzieć. – zetetic