Ich möchte oft Arrays vergleichen und sicherstellen, dass sie dieselben Elemente in beliebiger Reihenfolge enthalten. Gibt es eine prägnante Möglichkeit, dies in RSpec zu tun?
Hier sind Methoden, die nicht akzeptabel sind:
#to_set
Beispielsweise:
expect(array.to_set).to eq another_array.to_set
oder
array.to_set.should == another_array.to_set
Dies schlägt fehl, wenn die Arrays doppelte Elemente enthalten.
#sort
Beispielsweise:
expect(array.sort).to eq another_array.sort
oder
array.sort.should == another_array.sort
Dies schlägt fehl, wenn die Arrays-Elemente nicht implementiert werden #<=>
to_set
undsize
tatsächlich nicht zu tun, was Sie wollen. ZB würde [a, b, b] mit [a, a, b] übereinstimmen. Prost!eq
Matcher, zBexpect([1, 2]).to_not eq([2, 1])
Antworten:
Versuchen
array.should =~ another_array
Die beste Dokumentation dazu ist der Code selbst, der hier ist .
quelle
Passes if actual contains all of the expected regardless of order.
.expect([1, 2, 3]).to match_array([2, 1, 3])
sehen: stackoverflow.com/a/19436763/33226Seit RSpec 2.11 können Sie auch verwenden
match_array
.Was in einigen Fällen besser lesbar sein könnte.
quelle
eq()
, also denke ich,match_array()
ist vage genug für mich.match_array
ist ein Alias fürcontain_exactly
( Dokumentation )Ich habe festgestellt
=~
, dass es unvorhersehbar ist, und es ist ohne ersichtlichen Grund gescheitert. Nach 2.14 sollten Sie wahrscheinlich verwendenquelle
expect([1, 2, 3]).to contain_exactly(2, 3, 1)
. relishapp.com/rspec/rspec-expectations/v/3-0/docs/…Verwenden Sie
match_array
, das ein anderes Array als Argument verwendet odercontain_exactly
jedes Element als separates Argument verwendet und manchmal für die Lesbarkeit hilfreich ist. ( docs )Beispiele:
oder
quelle
Für RSpec 3 verwenden Sie
contain_exactly
:Weitere Informationen finden Sie unter https://relishapp.com/rspec/rspec-expectations/v/3-2/docs/built-in-matchers/contain-exactly-matcher. Hier ist jedoch ein Auszug:
Wie andere darauf hingewiesen haben, sollten Sie, wenn Sie das Gegenteil behaupten möchten, dass die Arrays sowohl dem Inhalt als auch der Reihenfolge entsprechen sollten, verwenden
eq
, dh:quelle
nicht sehr gut dokumentiert, aber ich habe trotzdem Links hinzugefügt:
Rspec3- Dokumente
expect(actual).to eq(expected)
Rspec2- Dokumente
expect([1, 2, 3]).to match_array([2, 3, 1])
quelle
.to eq
Methode, nicht auf diematch_array
.