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
smartass가 아니라 비교 to_set하고 size실제로 원하는 것을하지 않습니다. 예를 들어 [a, b, b]는 [a, a, b]와 일치합니다. 건배!
Jo Liss

3
여기에서 우연히 궁금해하는 사람들에게는 질서가 같아야한다 . 사용 eq예를 들어, 정규,expect([1, 2]).to_not eq([2, 1])
데니스

답변:


263

시험 array.should =~ another_array

찾을 수있는이 I에 가장 좋은 문서는 코드 자체이며, 여기 .


이것은 주문을 고려하지 않으므로 받아 들일만한 대답이 아닙니다. 문서 에서 인용 : Passes if actual contains all of the expected regardless of order..
Joshua Muheim

16
이 게시물의 제목 : "Rspec :"array.should == another_array "이지만 순서는 신경 쓰지 않습니다"
x1a4

3
이것은 이제 공식적으로 연산자 매처에
Kelvin

7
rspec 3.0에있는 새로운 "expect"구문을 사용하는 경우 @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
p, 레일 4로 업그레이드하고 = _ match_array가 잘 작동하는 곳에서 작동을 멈췄습니다. 감사합니다!
opsb

2
더 읽기 쉬운 지 모르겠습니다. 이제는 정확히 일치해야하지만 그렇지 않습니다. 이전의 구불 구불 한 부분은 모호한 것으로 배열에 아무런 의미가 없었기 때문에 선입견이 없었습니다. 어쩌면 나일지도 몰라
Trejkaz

1
"정확한"의 경우, 당신은 항상 가지고 eq()있으므로, 나는 match_array()모호하다고 생각 합니다.
awendt

이것은 주문 목록에서 작동하지 않습니다. 동일한 순서로 다른 항목을 가진 목록은 동일하다고 생각합니다. :-(
djangofan

FWIW는 match_array별칭입니다 contain_exactly( 문서 )
루이 디아즈


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 를 참조 하십시오 .

contains_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
rspec3에서 expect (actual) .to eq (expected) 및 expect (actual) .to match_array (expected)는 모두 작동하지만 서로 다른 작업을 수행합니다. #match_array는 순서를 무시하지만 #eq는 순서를 무시합니다.
gucki

1
OP는 주문을 무시하도록 구체적으로 요청했기 때문에 질문에 대답하지 않습니다.
NobodysNightmare

예! 이것은 나를 위해 일했습니다. 요소의 순서가 같지 않으면 비교가 실패합니다. 감사합니다! 이 .to eq아닌 메소드를 참조 합니다 match_array.
djangofan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.