Frequentemente, quero comparar matrizes e garantir que elas contenham os mesmos elementos, em qualquer ordem. Existe uma maneira concisa de fazer isso no RSpec?
Aqui estão métodos que não são aceitáveis:
#to_set
Por exemplo:
expect(array.to_set).to eq another_array.to_set
ou
array.to_set.should == another_array.to_set
Isso falha quando as matrizes contêm itens duplicados.
#sort
Por exemplo:
expect(array.sort).to eq another_array.sort
ou
array.sort.should == another_array.sort
Isso falha quando os elementos de matriz não implementam #<=>
to_set
esize
realmente não faz o que você deseja. Por exemplo, [a, b, b] corresponderia a [a, a, b]. Felicidades!eq
marcador, por exemplo,expect([1, 2]).to_not eq([2, 1])
Respostas:
Experimentar
array.should =~ another_array
A melhor documentação sobre isso que posso encontrar é o próprio código, que está aqui .
fonte
Passes if actual contains all of the expected regardless of order.
.expect([1, 2, 3]).to match_array([2, 1, 3])
ver: stackoverflow.com/a/19436763/33226Desde o RSpec 2.11, você também pode usar
match_array
.O que poderia ser mais legível em alguns casos.
fonte
eq()
, então acho quematch_array()
é vago o suficiente para mim.match_array
é um alias paracontain_exactly
( documentação )Eu achei
=~
imprevisível e falhou sem motivo aparente. Após a versão 2.14, você provavelmente deve usarfonte
expect([1, 2, 3]).to contain_exactly(2, 3, 1)
. relishapp.com/rspec/rspec-expectations/v/3-0/docs/...Use
match_array
, que aceita outra matriz como argumento, oucontain_exactly
que aceita cada elemento como argumento separado e, às vezes, é útil para facilitar a leitura. ( docs )Exemplos:
ou
fonte
Para o RSpec 3, use
contain_exactly
:Consulte https://relishapp.com/rspec/rspec-expectations/v/3-2/docs/built-in-matchers/contain-exactly-matcher para obter detalhes, mas aqui está um extrato:
Como outros já apontaram, se você deseja afirmar o contrário, que as matrizes devem corresponder ao conteúdo e à ordem, use
eq
:fonte
não está muito bem documentado, mas adicionei links de qualquer maneira:
Docs Rspec3
expect(actual).to eq(expected)
Docs Rspec2
expect([1, 2, 3]).to match_array([2, 3, 1])
fonte
.to eq
método, não aomatch_array
.