2011-01-18 11 views
15

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?

Odpowiedz

17
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 

przechodzi. Nie jestem pewien, co się dzieje w twoim konkretnym przypadku. Czy masz kilka nieudanych przykładów, którymi możesz się podzielić?

programowania Ruby ma do powiedzenia:

Równość - dwa hashe są równe jeśli mają taką samą wartość domyślną, zawierają taką samą liczbę kluczy, a wartość odpowiadającą każdej z kluczem pierwszy hasz jest równy (przy użyciu ==) do wartość tego samego klucza w sekund.

+0

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

+3

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

3

Wierzę w eql? Metoda sprawdza tylko, że dwa hashe mają taką samą treść Więc IIRC w Rspec2 można zrobić:

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

a test powinien przejść

+0

lub w RSpec 3, 'spodziewać (x) .Aby eql (y) ' – nruth

6

Od 8 miesięcy gem rspec-matchers posiada wsparcie dla dopasowania skrótów:

expected.should be_hash_matching(subhash_or_equal) 

zobaczyć tutaj po więcej szczegółów: https://github.com/rspec/rspec-expectations/pull/79

+0

to wydaje się być usunięte w rspec 3, ale '.to eql (x)' działa – nruth

Powiązane problemy