Ajax リクエストをアサートして、Ruby on Rails機能テストからのJSON出力をテストできますか?
[〜#〜] json [〜#〜] gemのJSON.parseを使用します。これは、入力として文字列を受け取り、JSONが表すRubyハッシュ)を返します。
テストの基本的な要点は次のとおりです。
user = JSON.parse(@response.body)
assert_equal "Mike", user['name']
Gemのドキュメントは次のとおりです。 http://json.rubyforge.org/ 。また、JSON gemを [〜#〜] irb [〜#〜] で簡単に再生できます。
RailsにはJSONサポートが組み込まれています:
def json_response
ActiveSupport::JSON.decode @response.body
end
プラグインは不要
その後、次のようなことができます:
assert_equal "Mike", json_response['name']
RSpecを使用している場合、json_specは一見の価値があります
また、短いJSON応答の場合は、JSONの文字列を@ response.bodyに単純に一致させることができます。これにより、さらに別のgemに依存する必要がなくなります。
assert_equal '{"total_votes":1}', @response.body
前述のように、JSON.parseを使用してJSONをテストしますが、そのアサーションを実行する場所は、JSONのレンダリング方法によって異なります。
コントローラーでJSONを生成する場合、コントローラーの機能テストでJSONを解析します(他の答えが表示されているように)。 Jbuilder 、 rabl 、またはこのアプローチを取る別のgemを使用してビューでJSONをレンダリングする場合、 ビューユニットテストでJSONを解析 =コントローラーの機能テストではありません。単体テストは一般に実行が速く、記述が簡単です。たとえば、データベースでモデルを作成するのではなく、メモリ内でモデルを構築できます。
Railsの新しいバージョンでは、parsed_body
作業なしでテストでこれにアクセスできるようにします。
応答でparsed_bodyを呼び出すと、最後の応答MIMEタイプに基づいて応答本文が解析されます。
すぐに使用できるのは、:jsonのみです。ただし、登録したカスタムMIMEタイプについては、独自のエンコーダーを追加できます...
https://api.rubyonrails.org/v5.2.1/classes/ActionDispatch/IntegrationTest.html
実際、暗黙的にJSONモジュールを使用できます。
assert_equal assigns(:user).to_json, @response.body
どの回答も、JSON応答を検証するための保守可能なニースを提供しません。私はこれが最高だと思う:
https://github.com/Ruby-json-schema/json-schema
標準 jsonスキーマ のNice実装を提供します
次のようなスキーマを作成できます。
_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クライアント実装に対してそれを検証する最良の方法。