wake-up-neo.com

So testen Sie das JSON-Ergebnis aus Ruby on Rails-Funktionstests

Wie kann ich meine Ajax - Anfrage bestätigen und die JSON-Ausgabe von Ruby on Rails-Funktionstests testen?

67
William Yeung

Verwenden Sie die JSON.parse von JSON gem, die einen String als Eingabe verwendet und einen Ruby-Hash zurückgibt, den der JSON darstellt.

Hier ist der grundlegende Gist für einen Test:

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

Hier ist die Dokumentation für das Juwel: http://json.rubyforge.org/ . Sie können auch ganz leicht mit dem JSON-Juwel in IRB spielen.

79
nicholaides

Rails verfügt über eine integrierte JSON-Unterstützung:

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

Kein Plugin nötig

Dann kannst du so etwas machen:

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

Wenn Sie RSpec verwenden, ist json_spec einen Blick wert

https://github.com/collectiveidea/json_spec

6
acw

Auch für kurze JSON-Antworten können Sie einfach eine Zeichenfolge des JSON mit @ response.body abgleichen. Dies verhindert, dass Sie sich auf einen weiteren Edelstein verlassen müssen.

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

Wie bereits erwähnt, verwenden Sie JSON.parse, um den JSON zu testen. Wo Sie diese Assertion durchführen, hängt jedoch davon ab, wie Sie den JSON rendern.

Wenn Sie den JSON im Controller generieren, parsen Sie den JSON in Controller-Funktionstests (wie die anderen Antworten zeigen). Wenn Sie JSON mit einer Ansicht mit Jbuilder , rabl oder einem anderen Edelstein, der diesen Ansatz verwendet, rendern, dann analysieren Sie die JSON in der Ansicht Unit-Tests nicht die Funktionstests der Controller. Komponententests sind im Allgemeinen schneller auszuführen und einfacher zu schreiben. Beispielsweise können Sie Modelle im Arbeitsspeicher erstellen, anstatt sie in der Datenbank zu erstellen.

1
Jay Mitchell

Tatsächlich können Sie das JSON-Modul implizit verwenden:

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

In neueren Versionen von Rails können Sie parsed_body verwenden, um in Ihren Tests ohne Arbeit darauf zugreifen zu können.

Beim Aufruf von parsed_body für die Antwort wird der Antworttext auf der Grundlage des MIME-Typs der letzten Antwort analysiert.

Nur aus der Box: Json wird unterstützt. Sie können jedoch für jeden benutzerdefinierten MIME-Typ, den Sie registriert haben, eigene Encoder hinzufügen ...

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

0
Mark G.

Keine der Antworten bietet eine nützliche Methode, um eine JSON-Antwort zu überprüfen. Ich finde, dass dies der Beste ist:

https://github.com/Ruby-json-schema/json-schema

Es bietet eine Nice-Implementierung für das Standardschema json

Sie können ein Schema wie schreiben:

schema = {
    "type"=>"object",
    "required" => ["a"],
    "properties" => {
        "a" => {
            "type" => "integer",
            "default" => 42
        },
        "b" => {
            "type" => "object",
            "properties" => {
                "x" => {
                    "type" => "integer"
                }
            }
        }
    }
}

und verwenden Sie es wie folgt: JSON::Validator.validate(schema, { "a" => 5 })

Bester Weg, um es gegen meine Android-Client-Implementierung zu überprüfen.

0
vedant