Saya sering ingin membandingkan array dan memastikan bahwa mereka mengandung elemen yang sama, dalam urutan apa pun. Apakah ada cara ringkas untuk melakukan ini di RSpec?
Berikut adalah metode yang tidak dapat diterima:
#to_set
Sebagai contoh:
expect(array.to_set).to eq another_array.to_set
atau
array.to_set.should == another_array.to_set
Ini gagal ketika array berisi item duplikat.
#sort
Sebagai contoh:
expect(array.sort).to eq another_array.sort
atau
array.sort.should == another_array.sort
Ini gagal ketika elemen array tidak diimplementasikan #<=>
to_set
dansize
sebenarnya tidak melakukan apa yang Anda inginkan. Misalnya [a, b, b] akan cocok dengan [a, a, b]. Bersulang!eq
pencocokan, misalnyaexpect([1, 2]).to_not eq([2, 1])
Jawaban:
Mencoba
array.should =~ another_array
Dokumentasi terbaik tentang ini dapat saya temukan adalah kode itu sendiri, yang ada di sini .
sumber
Passes if actual contains all of the expected regardless of order.
.expect([1, 2, 3]).to match_array([2, 1, 3])
dilihat: stackoverflow.com/a/19436763/33226Karena RSpec 2.11 Anda juga dapat menggunakan
match_array
.Yang bisa lebih mudah dibaca dalam beberapa kasus.
sumber
eq()
, jadi saya kiramatch_array()
cukup samar untuk saya.match_array
adalah alias untukcontain_exactly
( dokumentasi )Saya menemukan
=~
hal yang tidak dapat diprediksi dan gagal tanpa alasan yang jelas. Melewati 2,14, Anda mungkin harus menggunakansumber
expect([1, 2, 3]).to contain_exactly(2, 3, 1)
. relishapp.com/rspec/rspec-expectations/v/3-0/docs/…Gunakan
match_array
, yang menggunakan array lain sebagai argumen, ataucontain_exactly
, yang menggunakan setiap elemen sebagai argumen terpisah, dan terkadang berguna untuk keterbacaan. ( docs )Contoh:
atau
sumber
Untuk RSpec 3 gunakan
contain_exactly
:Lihat https://relishapp.com/rspec/rspec-expectations/v/3-2/docs/built-in-matchers/contain-exactly-matcher untuk detailnya, tapi inilah kutipannya:
Seperti yang telah ditunjukkan orang lain, jika Anda ingin menegaskan sebaliknya, bahwa array harus cocok dengan konten dan pesanan, kemudian gunakan
eq
, yaitu .:sumber
tidak didokumentasikan dengan baik tetapi saya menambahkan tautan:
Dokumen Rspec3
expect(actual).to eq(expected)
Rspec2 docs
expect([1, 2, 3]).to match_array([2, 3, 1])
sumber
.to eq
metode, bukanmatch_array
.