Rspec: “array.should == another_array” ancak sipariş konusunda endişe duymadan


235

Genellikle dizileri karşılaştırmak ve herhangi bir sırayla aynı öğeleri içerdiklerinden emin olmak istiyorum. RSpec'te bunu yapmanın kısa bir yolu var mı?

Kabul edilemeyen yöntemler şunlardır:

#to_set

Örneğin:

expect(array.to_set).to eq another_array.to_set

veya

array.to_set.should == another_array.to_set

Diziler yinelenen öğeler içerdiğinde bu başarısız olur.

#sort

Örneğin:

expect(array.sort).to eq another_array.sort

veya

array.sort.should == another_array.sort

Diziler öğeleri uygulanmadığında bu başarısız olur #<=>


7
Smartass için değil, karşılaştırma to_setve sizeaslında ne istediğinizi yapmaz. Örneğin [a, b, b] [a, a, b] ile eşleşir. Şerefe!
Jo Liss

3
Burada tersini merak eden tökezleyenler için: düzen aynı olmalıdır . eqEşleştiriciyi kullanın , örn.expect([1, 2]).to_not eq([2, 1])
Dennis

Yanıtlar:


263

Deneyin array.should =~ another_array

Bulabileceğim en iyi belgeler burada kodun kendisidir .


Bu siparişi hesaba katmaz, bu yüzden bu kabul edilebilir bir cevap değildir, değil mi? Alıntı docs : Passes if actual contains all of the expected regardless of order..
Joshua Muheim

16
Bu gönderinin başlığı: "Rspec:“ array.should == another_array ”ama sipariş için endişe duymadan"
x1a4

3
Bu artık resmi olarak eşleştiriciler
Kelvin

7
Rspec 3.0'da bulunan yeni "bekle" sözdizimini kullanıyorsanız, @JoshKovach yanıtına bakın.
clozach

46
Rspec 3.0 sözdizimi expect([1, 2, 3]).to match_array([2, 1, 3])bkz: stackoverflow.com/a/19436763/33226
Gavin Miller

238

RSpec 2.11'den beri de kullanabilirsiniz match_array.

array.should match_array(another_array)

Bazı durumlarda daha okunabilir olabilir.

[1, 2, 3].should =~ [2, 3, 1]
# vs
[1, 2, 3].should match_array([2, 3, 1])

8
yup, sadece raylar 4'e yükseltildi ve = ~ match_array'ın iyi çalıştığı yerde çalışmayı durdurdu, teşekkürler!
opsb

2
Daha okunaklı olup olmadığını bilmiyorum. Şimdi tam bir eşleşme olmalı gibi görünüyor, ama değil. Önceki dalgalı bir dizi için hiçbir şey ifade etmek için belirsiz, bu yüzden önyargı yoktu. Belki de sadece benim.
Trejkaz

1
"Kesin" için, her zaman var eq(), bu yüzden sanırım match_array()benim için yeterince belirsiz.
awendt

Bu benim için sıralı listelerde işe yaramıyor. Aynı öğeleri farklı bir sırayla içeren listelerin aynı olduğunu düşünüyor. :-(
djangofan

FWIW ( dokümantasyon ) match_arrayiçin bir takma addırcontain_exactly
Ruy Diaz


13

Kullanım match_arraybir bağımsız değişken olarak ya da başka bir dizisini alır, contain_exactlyayrı bir bağımsız değişken olarak, her elemanın alır ve okunabilirlik bazen kullanışlıdır. ( dokümanlar )

Örnekler:

expect([1, 2, 3]).to match_array [3, 2, 1]

veya

expect([1, 2, 3]).to contain_exactly 3, 2, 1

3

RSpec 3 kullanımı için contain_exactly:

Ayrıntılar için https://relishapp.com/rspec/rspec-expectations/v/3-2/docs/built-in-matchers/contain-exactly-matcher adresine bakın, ancak işte bir alıntı:

İçerme_ekle eşleştiricisi, dizileri gerçek ve beklenen dizi arasındaki sıralamadaki farklılıkları göz ardı edecek şekilde birbirleriyle test etmenin bir yolunu sunar. Örneğin:

    expect([1, 2, 3]).to    contain_exactly(2, 3, 1) # pass
    expect([:a, :c, :b]).to contain_exactly(:a, :c ) # fail

Diğerlerinin de belirttiği gibi, tersini iddia etmek istiyorsanız, dizilerin hem içerikle hem de sırayla eşleşmesi gerektiğini, ardından kullanın eq:

    expect([1, 2, 3]).to    eq([1, 2, 3]) # pass
    expect([1, 2, 3]).to    eq([2, 3, 1]) # fail

1

çok iyi belgelenmiş değil ama yine de bağlantılar ekledi:

Rspec3 belgeleri

expect(actual).to eq(expected)


Rspec2 belgeleri

expect([1, 2, 3]).to match_array([2, 3, 1])


11
Her ikisi de rspec3'te bekle (gerçek) .to eq (beklenen) ve bekle (gerçek) .to match_array (beklenen) için, ancak farklı şeyler yapıyorlar. #match_array sıralamayı yok sayar, #eq ise sıralamayı dikkate almaz.
gucki

1
OP soruyu cevaplamamasını istediği için bu soruya cevap vermiyor.
NobodysNightmare

Evet! Bu benim için çalıştı. Elemanların sırası aynı değilse başarısız olan bir karşılaştırma. Teşekkür ederim! .to eqYönteme başvuruyorum , değil match_array.
djangofan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.