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_set
y ensize
realidad no hace lo que quieres. Por ejemplo, [a, b, b] coincidiría con [a, a, b]. ¡Salud!eq
marcador, por ejemploexpect([1, 2]).to_not eq([2, 1])
Respuestas:
Tratar
array.should =~ another_array
La 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_array
es 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 eq
método, no almatch_array
.