A menudo quiero comparar matrices y asegurarme de que contengan los mismos elementos, en cualquier orden. ¿Hay una manera concisa de hacer esto en RSpec?
Aquí hay métodos que no son aceptables:
#to_set
Por ejemplo:
expect(array.to_set).to eq another_array.to_set
o
array.to_set.should == another_array.to_set
Esto falla cuando las matrices contienen elementos duplicados.
#sort
Por ejemplo:
expect(array.sort).to eq another_array.sort
o
array.sort.should == another_array.sort
Esto falla cuando los elementos de la matriz no se implementan #<=>

to_sety ensizerealidad no hace lo que quieres. Por ejemplo, [a, b, b] coincidiría con [a, a, b]. ¡Salud!eqmarcador, por ejemploexpect([1, 2]).to_not eq([2, 1])Respuestas:
Tratar
array.should =~ another_arrayLa mejor documentación sobre esto que puedo encontrar es el código en sí, que está aquí .
fuente
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/33226Desde RSpec 2.11 también puede usar
match_array.Lo que podría ser más legible en algunos casos.
fuente
eq(), así que supongo quematch_array()es lo suficientemente vago para mí.match_arrayes un alias paracontain_exactly( documentación )He encontrado
=~que es impredecible y ha fallado sin razón aparente. Pasado 2.14, probablemente deberías usarfuente
expect([1, 2, 3]).to contain_exactly(2, 3, 1). relishapp.com/rspec/rspec-expectations/v/3-0/docs/…Use
match_array, que toma otra matriz como argumento, ocontain_exactly, que toma cada elemento como un argumento separado, y a veces es útil para facilitar la lectura. ( documentos )Ejemplos:
o
fuente
Para el uso de RSpec 3
contain_exactly:Ver https://relishapp.com/rspec/rspec-expectations/v/3-2/docs/built-in-matchers/contain-exactly-matcher para más detalles, pero aquí hay un extracto:
Como otros han señalado, si desea afirmar lo contrario, que las matrices deben coincidir tanto con el contenido como con el orden, luego use
eq, es decir:fuente
no documentado muy bien pero agregué enlaces de todos modos:
Rspec3 docs
expect(actual).to eq(expected)Rspec2 docs
expect([1, 2, 3]).to match_array([2, 3, 1])fuente
.to eqmétodo, no almatch_array.