Często chcę porównywać tablice i upewnić się, że zawierają te same elementy, w dowolnej kolejności. Czy istnieje zwięzły sposób na zrobienie tego w RSpec?
Oto metody, które są niedopuszczalne:
#to_set
Na przykład:
expect(array.to_set).to eq another_array.to_set
lub
array.to_set.should == another_array.to_set
Nie udaje się to, gdy tablice zawierają zduplikowane elementy.
#sort
Na przykład:
expect(array.sort).to eq another_array.sort
lub
array.sort.should == another_array.sort
Nie powiedzie się to, gdy elementy tablic nie zostaną zaimplementowane #<=>
to_set
isize
faktycznie nie robi tego, co chcesz. Np. [A, b, b] pasuje do [a, a, b]. Twoje zdrowie!eq
dopasowywania, np.expect([1, 2]).to_not eq([2, 1])
Odpowiedzi:
Próbować
array.should =~ another_array
Najlepsza dokumentacja na ten temat, którą mogę znaleźć, to sam kod, który jest tutaj .
źródło
Passes if actual contains all of the expected regardless of order.
.expect([1, 2, 3]).to match_array([2, 1, 3])
: stackoverflow.com/a/19436763/33226Od wersji RSpec 2.11 możesz także używać
match_array
.Co może być bardziej czytelne w niektórych przypadkach.
źródło
eq()
, więc myślę, żematch_array()
jest dla mnie wystarczająco niejasny.match_array
to pseudonimcontain_exactly
( dokumentacja )Stwierdziłem,
=~
że jest nieprzewidywalny i zawiodła bez wyraźnego powodu. Po wersji 2.14 prawdopodobnie powinieneś użyćźródło
expect([1, 2, 3]).to contain_exactly(2, 3, 1)
. relishapp.com/rspec/rspec-expectations/v/3-0/docs/…Użyj
match_array
, która przyjmuje inną tablicę jako argument, lubcontain_exactly
która bierze każdy element jako osobny argument i czasami jest przydatna dla czytelności. ( dokumenty )Przykłady:
lub
źródło
W przypadku RSpec 3 użyj
contain_exactly
:Zobacz https://relishapp.com/rspec/rspec-expectations/v/3-2/docs/built-in-matchers/contain-exactly-matcher, aby uzyskać szczegółowe informacje, ale oto fragment:
Jak zauważyli inni, jeśli chcesz twierdzić coś przeciwnego, że tablice powinny pasować zarówno do treści, jak i kolejności, użyj
eq
:źródło
niezbyt dobrze udokumentowane, ale i tak dodałem linki:
Rspec3 docs
expect(actual).to eq(expected)
Rspec2 docs
expect([1, 2, 3]).to match_array([2, 3, 1])
źródło
.to eq
metodę, a niematch_array
.