[ruby] Rspec :“array.should == another_array”이지만 순서는 신경 쓰지 않습니다

배열을 비교하고 순서에 관계없이 동일한 요소를 포함하고 있는지 확인하고 싶습니다. 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

배열 요소가 구현되지 않으면 실패합니다. #<=>



답변

시험 array.should =~ another_array

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


답변

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])


답변

나는 =~예측할 수없는 것으로 나타 났으며 명백한 이유없이 실패했습니다. 지난 2.14에서는 아마도

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


답변

사용 match_array인수, 또는 다른 배열을, contain_exactly별도의 인수로 각 요소를 가져 와서 읽을 수 있도록 때로는 유용하다. ( 문서 )

예 :

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

또는

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


답변

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


답변

잘 문서화되지 않았지만 어쨌든 링크를 추가했습니다.

Rspec3 문서

expect(actual).to eq(expected)


Rspec2 문서

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


답변