developer tip

Ruby on Rails 기능 테스트에서 JSON 결과를 테스트하는 방법은 무엇입니까?

copycodes 2020. 10. 31. 09:50
반응형

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

참고URL : https://stackoverflow.com/questions/336716/how-to-test-json-result-from-ruby-on-rails-functional-tests

반응형