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 faire cela 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 de tableau n'implémentent pas #<=>
Utilisez match_array
, qui prend un autre tableau en tant qu'argument, ou contain_exactly
, qui prend chaque élément comme un argument séparé, et est parfois utile pour la lisibilité. ( docs )
Exemples:
expect([1, 2, 3]).to match_array [3, 2, 1]
ou
expect([1, 2, 3]).to contain_exactly 3, 2, 1
Essayez array.should =~ another_array
La meilleure documentation que je puisse trouver est le code lui-même, qui est ici .
Depuis RSpec 2.11, vous pouvez également utiliser match_array
.
array.should match_array(another_array)
Ce qui pourrait être plus lisible dans certains cas.
[1, 2, 3].should =~ [2, 3, 1]
# vs
[1, 2, 3].should match_array([2, 3, 1])
J'ai trouvé =~
imprévisible et il a échoué sans raison apparente. Passé 2.14, vous devriez probablement utiliser
expect([1, 2, 3]).to match_array([2, 3, 1])
Pour RSpec 3, utilisez contain_exactly
:
Voir https://relishapp.com/rspec/rspec-expectations/v/3-2/docs/built-in-matchers/contain-exactly-matcher pour les détails, mais voici un extrait:
Le matcher Container_exactly fournit un moyen de tester les tableaux les uns contre les autres d'une manière qui ne tient pas compte des différences dans l’ordre entre le tableau réel et le tableau attendu . Par exemple:
expect([1, 2, 3]).to contain_exactly(2, 3, 1) # pass expect([:a, :c, :b]).to contain_exactly(:a, :c ) # fail
Comme d'autres l'ont fait remarquer, si vous voulez affirmer le contraire, que les tableaux doivent correspondre au contenu et à l'ordre, utilisez eq
, c'est-à-dire:
expect([1, 2, 3]).to eq(1, 2, 3) # pass
expect([1, 2, 3]).to eq(2, 3, 1) # fail