Ruby on Rails 기능 테스트에서 JSON 결과를 테스트하는 방법은 무엇입니까?
Ajax 요청을 어설 션 하고 Ruby on Rails 기능 테스트의 JSON 출력을 테스트하려면 어떻게해야합니까?
문자열을 입력으로 받아 JSON이 나타내는 Ruby 해시를 반환하는 JSON gem의 JSON.parse를 사용합니다 .
다음은 테스트의 기본 요점입니다.
user = JSON.parse(@response.body)
assert_equal "Mike", user['name']
gem에 대한 문서는 다음과 같습니다 : http://json.rubyforge.org/ . 또한 IRB 에서 JSON gem을 매우 쉽게 사용할 수 있습니다.
Rails에는 JSON 지원이 내장되어 있습니다.
def json_response
ActiveSupport::JSON.decode @response.body
end
플러그인 필요 없음
그런 다음 다음과 같이 할 수 있습니다.
assert_equal "Mike", json_response['name']
RSpec을 사용하는 경우 json_spec 을 살펴볼 가치가 있습니다.
https://github.com/collectiveidea/json_spec
또한 짧은 JSON 응답의 경우 JSON 문자열을 @ response.body에 간단히 일치시킬 수 있습니다. 이것은 또 다른 보석에 의존하는 것을 방지합니다.
assert_equal '{"total_votes":1}', @response.body
실제로 암시 적으로 JSON 모듈을 사용할 수 있습니다.
assert_equal assigns(:user).to_json, @response.body
언급했듯이 JSON.parse를 사용하여 JSON을 테스트하지만 해당 어설 션을 수행하는 위치는 JSON을 렌더링하는 방법에 따라 다릅니다.
컨트롤러에서 JSON을 생성하는 경우 컨트롤러 기능 테스트에서 JSON을 구문 분석합니다 (다른 답변이 표시됨). Jbuilder , rabl 또는이 접근 방식을 사용하는 다른 gem을 사용하는 뷰로 JSON을 렌더링하는 경우 컨트롤러 기능 테스트가 아닌 뷰 단위 테스트에서 JSON 을 구문 분석합니다 . 단위 테스트는 일반적으로 실행이 더 빠르고 작성하기 쉽습니다. 예를 들어 데이터베이스에서 모델을 생성하는 대신 메모리에서 모델을 빌드 할 수 있습니다.
답변 중 어느 것도 JSON 응답을 확인하는 좋은 유지 관리 방법을 제공하지 않습니다. 나는 이것이 최고라고 생각합니다.
https://github.com/ruby-json-schema/json-schema
표준 json 스키마에 대한 멋진 구현을 제공합니다.
다음과 같은 스키마를 작성할 수 있습니다.
schema = {
"type"=>"object",
"required" => ["a"],
"properties" => {
"a" => {
"type" => "integer",
"default" => 42
},
"b" => {
"type" => "object",
"properties" => {
"x" => {
"type" => "integer"
}
}
}
}
}
다음과 같이 사용하십시오. JSON::Validator.validate(schema, { "a" => 5 })
내 안드로이드 클라이언트 구현에 대해 확인하는 가장 좋은 방법입니다.
최신 버전의 레일에서는 parsed_body
작업없이 테스트에서 이에 액세스 할 수 있습니다 .
응답에서 parsed_body를 호출하면 마지막 응답 MIME 유형을 기반으로 응답 본문을 구문 분석합니다.
기본적으로 : json 만 지원됩니다. 하지만 등록한 사용자 지정 MIME 유형에 대해 고유 한 인코더를 추가 할 수 있습니다.
https://api.rubyonrails.org/v5.2.1/classes/ActionDispatch/IntegrationTest.html
You can use the AssertJson gem for a nice DSL which allows you to check for keys and values which should exist in your JSON response.
Add the gem to your Gemfile
:
group :test do
gem 'assert_json'
end
This is a quick example how your functional/controller test could look like (the example is an adaption from their README):
class ExampleControllerTest < ActionController::TestCase
include AssertJson
def test_my_action
get :my_action, :format => 'json'
# => @response.body= '{"key":[{"inner_key":"value1"}]}'
assert_json(@response.body) do
has 'key' do
has 'inner_key', 'value1'
end
has_not 'key_not_included'
end
end
end
You just have to include the AssertJson
module in your test and use the assert_json
block where you can check the response for existent and non-existant keys and values. Hint: it's not immediately visible in the README, but to check for a value (e.g. if your action just returns an array of strings) you can do
def test_my_action
get :my_action, :format => 'json'
# => @response.body= '["value1", "value2"]'
assert_json(@response.body) do
has 'value1'
has 'value2'
has_not 'value3'
end
end
'developer tip' 카테고리의 다른 글
항목 입력 옵션이있는 HTML 콤보 상자 (0) | 2020.10.31 |
---|---|
ASP.NET Core 웹 API 인증 (0) | 2020.10.31 |
VBA 오류 처리를위한 좋은 패턴 (0) | 2020.10.31 |
SQL SELECT 다중 열 INTO 다중 변수 (0) | 2020.10.31 |
사전에 키, 값 쌍을 추가하는 방법은 무엇입니까? (0) | 2020.10.31 |