Je veux souvent comparer des tableaux et m'assurer qu'ils contiennent les mêmes éléments, dans n'importe quel ordre. Existe-t-il un moyen concis de le faire dans RSpec?
Voici des méthodes qui ne sont pas acceptables:
#to_set
Par exemple:
expect(array.to_set).to eq another_array.to_set
ou
array.to_set.should == another_array.to_set
Cela échoue lorsque les tableaux contiennent des éléments en double.
#sort
Par exemple:
expect(array.sort).to eq another_array.sort
ou
array.sort.should == another_array.sort
Cela échoue lorsque les éléments des tableaux ne sont pas implémentés #<=>
to_set
et ensize
fait ne fait pas ce que vous voulez. Par exemple [a, b, b] correspondrait à [a, a, b]. À votre santé!eq
matcher, par exempleexpect([1, 2]).to_not eq([2, 1])
Réponses:
Essayer
array.should =~ another_array
La meilleure documentation à ce sujet que je peux trouver est le code lui-même, qui est ici .
la source
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/33226Depuis RSpec 2.11, vous pouvez également utiliser
match_array
.Ce qui pourrait être plus lisible dans certains cas.
la source
eq()
, donc je suppose quematch_array()
c'est assez vague pour moi.match_array
est un alias pourcontain_exactly
( documentation )Je l'ai trouvé
=~
imprévisible et il a échoué sans raison apparente. Après 2.14, vous devriez probablement utiliserla source
expect([1, 2, 3]).to contain_exactly(2, 3, 1)
. relishapp.com/rspec/rspec-expectations/v/3-0/docs/…Utilisez
match_array
, qui prend un autre tableau comme argument, oucontain_exactly
, qui prend chaque élément comme argument séparé, et est parfois utile pour la lisibilité. ( documents )Exemples:
ou
la source
Pour l'utilisation de RSpec 3
contain_exactly
:Voir https://relishapp.com/rspec/rspec-expectations/v/3-2/docs/built-in-matchers/contain-exactly-matcher pour plus de détails, mais voici un extrait:
Comme d'autres l'ont souligné, si vous voulez affirmer le contraire, que les tableaux doivent correspondre à la fois au contenu et à l'ordre, alors utilisez
eq
, c'est-à-dire:la source
pas très bien documenté mais j'ai quand même ajouté des liens:
Rspec3 docs
expect(actual).to eq(expected)
Rspec2 docs
expect([1, 2, 3]).to match_array([2, 3, 1])
la source
.to eq
méthode, pas à lamatch_array
.