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


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

8 64

8 ответов:

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

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

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

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

Rails имеет встроенную поддержку JSON:

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

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

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

assert_equal "Mike", json_response['name']

Если вы используете RSpec,радио счастья. стоит посмотреть

https://github.com/collectiveidea/json_spec

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

assert_equal '{"total_votes":1}', @response.body

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

assert_equal assigns(:user).to_json, @response.body

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

Если вы генерируете JSON в контроллере, вы анализируете JSON в функциональных тестах контроллера (как показывают другие ответы). Если вы оказываете в формате JSON, с помощью Jbuilder,рабль или другой драгоценный камень, который принимает этот подход, то разбор 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 })

лучший способ проверить его против моей реализации клиента android.

можно использовать 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