Как проверить результат JSON из функциональных тестов Ruby on Rails?
Как я могу отстаивать свои Ajax запросить и проверить вывод JSON из функциональных тестов Ruby on Rails?
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']
также для коротких ответов 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