web-dev-qa-db-ja.com

Ruby on Rails機能テストからのJSON結果をテストするには?

Ajax リクエストをアサートして、Ruby on Rails機能テストからのJSON出力をテストできますか?

69
William Yeung

[〜#〜] json [〜#〜] gemのJSON.parseを使用します。これは、入力として文字列を受け取り、JSONが表すRubyハッシュ)を返します。

テストの基本的な要点は次のとおりです。

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

Gemのドキュメントは次のとおりです。 http://json.rubyforge.org/ 。また、JSON gemを [〜#〜] irb [〜#〜] で簡単に再生できます。

82
nicholaides

RailsにはJSONサポートが組み込まれています:

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

プラグインは不要

その後、次のようなことができます:

assert_equal "Mike", json_response['name']
84
Josh

RSpecを使用している場合、json_specは一見の価値があります

https://github.com/collectiveidea/json_spec

7
acw

また、短いJSON応答の場合は、JSONの文字列を@ response.bodyに単純に一致させることができます。これにより、さらに別のgemに依存する必要がなくなります。

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

前述のように、JSON.parseを使用してJSONをテストしますが、そのアサーションを実行する場所は、JSONのレンダリング方法によって異なります。

コントローラーでJSONを生成する場合、コントローラーの機能テストでJSONを解析します(他の答えが表示されているように)。 Jbuilderrabl 、またはこのアプローチを取る別のgemを使用してビューでJSONをレンダリングする場合、 ビューユニットテストでJSONを解析 =コントローラーの機能テストではありません。単体テストは一般に実行が速く、記述が簡単です。たとえば、データベースでモデルを作成するのではなく、メモリ内でモデルを構築できます。

1
Jay Mitchell

Railsの新しいバージョンでは、parsed_body作業なしでテストでこれにアクセスできるようにします。

応答でparsed_bodyを呼び出すと、最後の応答MIMEタイプに基づいて応答本文が解析されます。

すぐに使用できるのは、:jsonのみです。ただし、登録したカスタムMIMEタイプについては、独自のエンコーダーを追加できます...

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

1
Mark G.

実際、暗黙的にJSONモジュールを使用できます。

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

どの回答も、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クライアント実装に対してそれを検証する最良の方法。

0
vedant