Rspec: "array.should == another_array" लेकिन आदेश के लिए चिंता किए बिना


235

मैं अक्सर सरणियों की तुलना करना चाहता हूं और यह सुनिश्चित करना चाहता हूं कि वे किसी भी क्रम में समान तत्व शामिल हों। RSpec में ऐसा करने का एक संक्षिप्त तरीका है?

यहाँ ऐसी विधियाँ हैं जो स्वीकार्य नहीं हैं:

#to_set

उदाहरण के लिए:

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

या

array.to_set.should == another_array.to_set

यह तब विफल होता है जब सरणियों में डुप्लिकेट आइटम होते हैं।

#sort

उदाहरण के लिए:

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

या

array.sort.should == another_array.sort

यह तब विफल हो जाता है जब सरणियाँ तत्व कार्यान्वित नहीं होते हैं #<=>


7
स्मार्टास के लिए नहीं, लेकिन तुलना करना to_setऔर sizeवास्तव में वह नहीं करता जो आप चाहते हैं। जैसे [a, b, b] का मेल होगा [a, a, b]। चीयर्स!
जो लस

3
यहां ठोकर खाने वालों के लिए विपरीत सोच है: आदेश समान होना चाहिएeqमाचिस का उपयोग करें , जैसेexpect([1, 2]).to_not eq([2, 1])
डेनिस

जवाबों:


263

प्रयत्न array.should =~ another_array

इस पर सबसे अच्छा प्रलेखन मैं पा सकता हूँ कोड ही है, जो यहाँ है


यह आदेश को ध्यान में नहीं रखता है, इसलिए यह स्वीकार्य उत्तर नहीं है, क्या यह है? से उद्धरण डॉक्स : Passes if actual contains all of the expected regardless of order.
जोशुआ मुहीम

16
इस पोस्ट का शीर्षक: "Rspec:" array.should == एक और_अरे "लेकिन ऑर्डर के लिए चिंता किए बिना"
X1a4

3
अब यह आधिकारिक तौर पर ऑपरेटर मैचर्स के
केल्विन

7
यदि आप rspec 3.0 में नई "उम्मीद" वाक्यविन्यास का उपयोग कर रहे हैं, तो @JoshKovach से उत्तर देखें।
clozach

46
Rspec 3.0 सिंटैक्स देखा जाता है expect([1, 2, 3]).to match_array([2, 1, 3]): stackoverflow.com/a/19436763/33226
गैविन मिलर

238

RSpec 2.11 के बाद से आप भी उपयोग कर सकते हैं match_array

array.should match_array(another_array)

जो कुछ मामलों में अधिक पठनीय हो सकता है।

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

8
हाँ, बस 4 और = ~ के लिए अपग्रेड किया गया जहाँ काम करना बंद कर दिया गया है, जहां काम ठीक है, धन्यवाद!
opsb

2
मुझे पता है कि अगर अधिक पठनीय है। अब यह पढ़ता है कि यह एक सटीक मिलान होना चाहिए, लेकिन ऐसा नहीं है। पिछली स्क्वीगल एक सरणी के लिए कुछ भी नहीं कहने के लिए पर्याप्त अस्पष्ट थी, इसलिए मेरे पास पूर्व धारणा नहीं थी। शायद यह सिर्फ मैं ही हूं।
तर्जुक

1
"सटीक" के लिए, आपके पास हमेशा होता है eq(), इसलिए मुझे लगता match_array()है कि मेरे लिए पर्याप्त अस्पष्ट है।
awendt

यह मेरे लिए आदेशित सूचियों पर काम नहीं करता है। यह सोचता है कि सूचियां, जिनके पास अलग-अलग क्रम में समान आइटम हैं, समान हैं। :-(
djangofan

FWIW ( प्रलेखन ) के match_arrayलिए एक उपनाम हैcontain_exactly
रुय डियाज़

136

मैंने =~अप्रत्याशित पाया है और यह बिना किसी स्पष्ट कारण के विफल रहा है। पिछले 2.14, आपको शायद उपयोग करना चाहिए

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

17
इसके अलावा मान्य 3.0 expect([1, 2, 3]).to contain_exactly(2, 3, 1):। relishapp.com/rspec/rspec-expectations/v/3-0/docs/…
clozach

13

उपयोग करें match_array, जो एक तर्क के रूप में एक और सरणी लेता है, या contain_exactly, जो प्रत्येक तत्व को एक अलग तर्क के रूप में लेता है, और कभी-कभी पठनीयता के लिए उपयोगी होता है। ( डॉक्स )

उदाहरण:

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

या

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

3

RSpec 3 उपयोग के लिए contain_exactly:

देखें https://relishapp.com/rspec/rspec-expectations/v/3-2/docs/built-in-matchers/contain-exactly-matcher जानकारी के लिए, लेकिन यहाँ एक उद्धरण है:

Cont_exactly मिलानकर्ता एक दूसरे के विरुद्ध सरणियों का परीक्षण करने का एक तरीका प्रदान करता है जो वास्तविक और अपेक्षित सरणी के बीच अंतरों की अवहेलना करता है। उदाहरण के लिए:

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

जैसा कि अन्य ने बताया है, यदि आप इसके विपरीत जाना चाहते हैं, तो सरणियों को सामग्री और ऑर्डर दोनों से मेल खाना चाहिए, फिर उपयोग करें eq, अर्थात:

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

1

बहुत अच्छी तरह से प्रलेखित नहीं है, लेकिन मैंने लिंक को किसी भी तरह जोड़ा:

Rspec3 डॉक्स

expect(actual).to eq(expected)


Rspec2 डॉक्स

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


11
दोनों (वास्तविक) .to eq (अपेक्षित) और उम्मीद (वास्तविक) .to match_array (अपेक्षित) rspec3 में काम करते हैं, लेकिन वे अलग-अलग चीजें कर रहे हैं। #match_array ऑर्डर की अनदेखी करता है, जबकि #eq नहीं करता है।
गुच्ची

1
यह सवाल का जवाब नहीं देता है, क्योंकि ओपी ने विशेष रूप से आदेश की अवहेलना करने के लिए कहा है।
1919

हाँ! इसने मेरे लिए काम किया। एक तुलना जो विफल हो जाती है यदि तत्वों का क्रम समान नहीं है। धन्यवाद! मैं .to eqविधि का उल्लेख करता हूं , न कि match_array
djangofan
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.