web-dev-qa-db-fra.com

Rspec: "array.should == another_array" mais sans souci d'ordre

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 #<=>

218
nicholaides

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
6
nicholaides

Essayez array.should =~ another_array

La meilleure documentation que je puisse trouver est le code lui-même, qui est ici .

260
x1a4

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])
221
Valentin Nemcev

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])
129
Josh Kovach

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
0
Tim Diggins