2012-12-19 22 views
15

Ich bin neu in Ruby (ersten Tag mit Ruby arbeiten) so bitte verzeihen Sie alle Anfänger Fragen und mangelndes Verständnis.Wie testet man eine JSON REST API

Ich versuche, die Antworten auf http Callouts zu validieren.

Zum Beispiel, sagen wir, der Endpunkt ist die folgende:

https://applicationname-api-sbox02.herokuapp.com 

Und ich versuche, um einen Benutzer zu authentifizieren, indem eine GET-Anfrage wie folgt zu senden:

get_response = RestClient.get("https://applicationname-api-sbox02.herokuapp.com/api/v1/users", 
        { 
         "Content-Type" => "application/json", 
         "Authorization" => "token 4db7e46008f215cdb7d120cdd7", 
         "Manufacturer-Token" => "8d0693ccfe65104600e2555d5af34213" 
        } 
       ) 
Jetzt

, ich möchte die Antwort validieren und folgendermaßen vorgehen: - die Antwort analysieren, um sicherzustellen, dass sie gültig ist JSON - eine Überprüfung durchführen und überprüfen, ob JSON die korrekten Daten enthält (verifizieren Sie, dass id == 4 ist) - wenn ein Fehler auftritt ist e Aufgetreten, eine Ausnahme mit der 'Raise' -Methode auslösen.

In meinem ersten schwachen Versuch habe ich versucht, die folgenden:

puts get_response.body 
if get_response.code == 200 
puts "********* Get current user successful" 
else 
puts "Get current user failed!!" 
end 

Nun, dies ergab, dass der aktuelle Benutzer immer erfolgreich war, aber wie eigentlich analysieren ich das json, überprüfen Sie die korrekte ID und heben ein Ausnahme wenn ein Fehler aufgetreten ist?

+1

Duplikat von http://stackoverflow.com/questions/5410682/parsing-a-json-string-in-ruby –

+1

@AaronKurtzhals: Es geht darum, einen Test für den Client-Code zu erstellen, und nicht unbedingt einen JSON-String zu analysieren. –

Antwort

17

Statt eine Ausnahme zu heben, einen Test schreiben.

Ein einfacher Ansatz, den json-Parser und Unit-Test-Framework der lib std:

require 'minitest/autorun' 
require 'rest_client' 
require 'json' 

class APITest < MiniTest::Unit::TestCase 
    def setup 
    response = RestClient.get("https://applicationname-api-sbox02.herokuapp.com/api/v1/users", 
     { 
     "Content-Type" => "application/json", 
     "Authorization" => "token 4db7e46008f215cdb7d120cdd7", 
     "Manufacturer-Token" => "8d0693ccfe65104600e2555d5af34213" 
     } 
    ) 
    @data = JSON.parse response.body 
    end 

    def test_id_correct 
    assert_equal 4, @data['id'] 
    end 
end 

mit Execute ruby $filename

JSON.parse parst ein JSON-String in einen Rubin hash

Getting started with minitest

Wenn Sie Ruby 1.8 verwenden, müssen Sie ins groß die json gem und entweder installieren Sie die minitest gem, oder wechseln Sie zur älteren Testunit API. Wenn Sie sich für Letzteres entscheiden, dann müssen Sie require 'minitest/autorun' ändern ->require 'test/unit' und MiniTest::Unit::TestCase ->Test::Unit::TestCase

+0

Hallo @ireddick, danke für die Hilfe. Ich habe versucht, Ihr Beispiel, aber habe den Fehler: nicht initialisierte Konstante Minitest – Dman100

+0

Ich bin 1.9.3p327 ausgeführt (2012-11-10) [i386-mingw321] – Dman100

+0

@ Dman100 - "nicht initialisierte Konstante Minitest" bedeutet, Sie haben MiniTest – ireddick

2

hier ein Beispiel aus unserer Spezifikationen ist so können Sie sehen, wie wir json api testen:

it 'returns charge' do 
    get "/charges/#{charge.id}", '', headers 

    expect(response.status).to eq(200) 
    expect(response).to match_response_schema(:charge) 
    expect(response).to match_json(<<-JSON) 
    { 
    "id":"{id}", 
    "email": "{email}", 
    "ip": "127.0.0.1", 
    "amount": 10500, 
    "state": "captured", 
    "captured_amount": 10500, 
    } 
    JSON 
end 

Lets betrachten es eng

  1. match_response_schema(:charge)

Dieser Matcher überprüft, dass json, das wir als Antwort erhalten, im Allgemeinen gültig ist. Wir verwenden dafür json-schema (json schema validator). Guys von Thoughtbot haben a detailed guide wie JSON Schema Validator zu verwenden und eigene Matcher in diesem Blog-Post zu erstellen.

Understanding JSON Schema ist, wo ich viele nützliche Informationen zum Erstellen von Schemas für JSON-Dokumente erhalten habe.

  1. match_json

Das eigene Matcher ist und wir match_json Juwel vor kurzem veröffentlicht haben. Mit ihr können Sie die Struktur und Werte Ihres JSON testen. Hier sind zwei große Merkmale dieser Matcher:

  • , wenn Sie nicht genau Werte kennen, können Sie Muster wie {id} verwenden, {uuid} {} date_time, etc. haben wir Muster vorgegeben, aber Sie können hinzufügen deine eigenen auch.
  • erhalten Sie klare Fehlermeldung, was falsch mit Ihrem JSON ist z. "5" wurde nicht in "> array" gefunden: [1,2,3]