배열을 비교하고 순서에 관계없이 동일한 요소를 포함하고 있는지 확인하고 싶습니다. 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
배열 요소가 구현되지 않으면 실패합니다. #<=>
답변
답변
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