Как проверить результат JSON из функциональных тестов Ruby on Rails? - PullRequest
68 голосов
/ 03 декабря 2008

Как мне подтвердить мой запрос Ajax и проверить вывод JSON из функциональных тестов Ruby on Rails?

Ответы [ 9 ]

83 голосов
/ 21 августа 2010

В Rails встроена поддержка JSON:

def json_response
    ActiveSupport::JSON.decode @response.body
end

Нет необходимости в плагине

Тогда вы можете сделать что-то вроде этого:

assert_equal "Mike", json_response['name']
81 голосов
/ 28 декабря 2008

Используйте файл JSON.parse JSON , который принимает строку в качестве входных данных и возвращает хэш Ruby, который представляет JSON.

Вот основная суть теста:

user = JSON.parse(@response.body)
assert_equal "Mike", user['name']

Вот документация для драгоценного камня: http://json.rubyforge.org/. Кроме того, вы можете играть с драгоценным камнем JSON в IRB довольно легко.

6 голосов
/ 01 августа 2011

Если вы используете RSpec, json_spec стоит посмотреть

https://github.com/collectiveidea/json_spec

4 голосов
/ 20 марта 2010

Также для коротких ответов JSON вы можете просто сопоставить строку JSON с @ response.body. Это предотвращает необходимость полагаться на еще один драгоценный камень.

assert_equal '{"total_votes":1}', @response.body
1 голос
/ 13 декабря 2018

В более новых версиях рельсов вы можете использовать parsed_body, чтобы получить доступ к этому в своих тестах без какой-либо работы.

Вызов parsed_body для ответа анализирует тело ответа на основе MIME-типа последнего ответа.

Только из коробки: поддерживается json. Но для любых пользовательских типов MIME, которые вы зарегистрировали, вы можете добавить свои собственные кодеры ...

https://api.rubyonrails.org/v5.2.1/classes/ActionDispatch/IntegrationTest.html

1 голос
/ 06 сентября 2014

Как уже отмечалось, вы используете JSON.parse для тестирования JSON, но то, где вы выполняете это утверждение, зависит от того, как вы выполняете рендеринг JSON.

Если вы генерируете JSON в контроллере, вы анализируете JSON в функциональных тестах контроллера (как показывают другие ответы). Если вы выполняете рендеринг JSON с использованием вида Jbuilder , rabl или другого драгоценного камня, который использует этот подход, то анализирует JSON в тестах модуля представления , а не функциональные тесты контроллера. Модульные тесты обычно выполняются быстрее и проще в написании - например, вы можете создавать модели в памяти, а не создавать их в базе данных.

1 голос
/ 12 июля 2013

На самом деле, вы можете неявно использовать модуль JSON:

assert_equal assigns(:user).to_json, @response.body
0 голосов
/ 26 апреля 2016

Ни один из ответов не обеспечивает хороший поддерживаемый способ проверки ответа 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 })

Лучший способ проверить это в моей реализации на Android-клиенте.

0 голосов
/ 14 января 2014

Вы можете использовать AssertJson gem для хорошего DSL, который позволяет вам проверять ключи и значения, которые должны присутствовать в вашем ответе JSON.

Добавьте драгоценный камень к вашему Gemfile:

group :test do
  gem 'assert_json'
end

Это быстрый пример того, как может выглядеть ваш функциональный тест / тест контроллера (пример является адаптацией их 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

Вам просто нужно включить модуль AssertJson в свой тест и использовать блок assert_json, где вы можете проверить ответ для существующих и несуществующих ключей и значений. Подсказка: это не сразу видно в README , но чтобы проверить значение (например, если ваше действие просто возвращает массив строк), вы можете сделать

  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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...