JSON 비교 솔루션
깨끗하지만 잠재적으로 큰 Diff를 생성합니다.
actual = JSON.parse(response.body, symbolize_names: true)
expected = { foo: "bar" }
expect(actual).to eq expected
실제 데이터의 콘솔 출력 예 :
expected: {:story=>{:id=>1, :name=>"The Shire"}}
got: {:story=>{:id=>1, :name=>"The Shire", :description=>nil, :body=>nil, :number=>1}}
(compared using ==)
Diff:
@@ -1,2 +1,2 @@
-:story => {:id=>1, :name=>"The Shire"},
+:story => {:id=>1, :name=>"The Shire", :description=>nil, ...}
(@floatingrock의 의견에 감사드립니다)
문자열 비교 솔루션
철제 용액을 원한다면 잘못된 양성 평등을 유발할 수있는 파서를 사용하지 않아야합니다. 응답 본문을 문자열과 비교하십시오. 예 :
actual = response.body
expected = ({ foo: "bar" }).to_json
expect(actual).to eq expected
그러나이 두 번째 솔루션은 이스케이프 된 따옴표가 많이 포함 된 직렬화 된 JSON을 사용하므로 시각적으로 친숙하지 않습니다.
맞춤형 매처 솔루션
JSON 경로가 다른 재귀 슬롯을 정확하게 정확하게 찾아내는 사용자 지정 매처를 작성하는 경향이 있습니다. rspec 매크로에 다음을 추가하십시오.
def expect_response(actual, expected_status, expected_body = nil)
expect(response).to have_http_status(expected_status)
if expected_body
body = JSON.parse(actual.body, symbolize_names: true)
expect_json_eq(body, expected_body)
end
end
def expect_json_eq(actual, expected, path = "")
expect(actual.class).to eq(expected.class), "Type mismatch at path: #{path}"
if expected.class == Hash
expect(actual.keys).to match_array(expected.keys), "Keys mismatch at path: #{path}"
expected.keys.each do |key|
expect_json_eq(actual[key], expected[key], "#{path}/:#{key}")
end
elsif expected.class == Array
expected.each_with_index do |e, index|
expect_json_eq(actual[index], expected[index], "#{path}[#{index}]")
end
else
expect(actual).to eq(expected), "Type #{expected.class} expected #{expected.inspect} but got #{actual.inspect} at path: #{path}"
end
end
사용 예 1 :
expect_response(response, :no_content)
사용 예 2 :
expect_response(response, :ok, {
story: {
id: 1,
name: "Shire Burning",
revisions: [ ... ],
}
})
출력 예 :
Type String expected "Shire Burning" but got "Shire Burnin" at path: /:story/:name
중첩 된 배열에서 불일치가 발생했음을 보여주는 또 다른 예제 출력
Type Integer expected 2 but got 1 at path: /:story/:revisions[0]/:version
보시다시피, 출력은 예상 JSON을 수정하는 위치를 정확하게 알려줍니다.