2015-02-02 7 views
9

Ich möchte testen, wie eine REST-API eine POST-Anforderung behandelt, die einen Textkörper mit ungültiger JSON-Syntax aufweist, beispielsweise ein fehlendes Komma. Ich verwende node.js, um die API-Tests zu schreiben. Ich benutze frisby, aber ich habe auch versucht supertest. Kein Glück. Mit den vorherigen Tools übergeben Sie den Anfragetext als JavaScript-Objekt, also ist es nicht möglich. Ich habe auch versucht, den ungültigen JSON ohne Erfolg als String zu übergeben, da ein String auch ein gültiger JSON ist (Beispiel unten). Irgendwelche Ideen?Testen Sie, wie die API einen ungültigen JSON-Syntaxanforderungskörper mithilfe von node.js behandelt

frisby.create('Ensure response has right status') 
    .post('http://example.com/api/books', '{"invalid"}', {json: true}) 
    .expectStatus(400) 
    .toss(); 
+0

Können Sie Beispiele für die von Ihnen verwendete Zeichenfolge und Objekte angeben? – Demurgos

+0

@Demurgos Ein Beispiel hinzugefügt, danke. – alefteris

+1

Wenn Sie diesen Test benötigen, muss eine Situation eintreten, in der Sie erwarten, dass dieser Fehler auftritt. Können Sie ein Szenario bereitstellen, wenn dieser Fehler auftritt? – freele

Antwort

4

den Supertest und Mokka-Pakete verwenden, können Sie einen Endpunkt testen, indem Sie die ungültigen JSON wie dieses Posting:

var request = require('supertest'); 

describe('Adding new book', function(){ 
    it('with invalid json returns a 400', function(done){ 
    request('http://example.com').post('/api/books') 
     .send('{"invalid"}') 
     .type('json') 
     .expect('Content-Type', /json/) 
     .expect(400) 
     .end(function(err, res) { 
      console.log(res.error); 
      done(); 
     }); 
    }); 
}); 

Das wichtige Bit ist hier type(json). Dadurch wird der Inhaltstyp der Anfrage an die Anwendung/json gesetzt. Ohne es wird supertest/superagent standardmäßig Strings als application/x-www-form-urlencoded senden. Außerdem wird das ungültige JSON als Zeichenfolge und nicht als JavaScript-Objekt bereitgestellt.

3

Ich habe noch nie Frisby oder Superagenten verwendet, aber ich finde, es gibt zwei Fragen hier:

1. passing an invalid JSON from client to server using POST method.

was nicht möglich ist, da wird es bald auf der Client-Seite selbst abgelehnt werden, und Sie Es wird ein Fehler angezeigt, bevor eine POST-Anfrage an den Server gestellt wird. (Weil, da es nur Strings, während sie mit http arbeiten, wird der Client selbst versuchen, das JSON stringify, wo es mit ungültiger JSON stecken erhalten)

2. pass an invalid JSON just as a string

Beispiel: Stellen Sie eine Zeichenfolge wie folgt mit JQuery

$.post("demo_test_post.asp", 
    { 
     name: 'pqr:{"abc":"abc",}' // see there is a comma at the end making JSON invalid 
    }, 
    function(data, status){ 
     alert("Data: " + data + "\nStatus: " + status); 
    }); 

Dies wird effektiv die ungültige JSON (Name in diesem Fall) an den Server als Srting übergeben. Dazu müssen Sie jedoch die Zeichenfolge unter Verwendung von JSON.parse() zu JSON analysieren, bevor Sie sie verwenden können. Und wenn Sie versuchen, dass Sie diese:

SyntaxError: Unexpected token p at Object.parse (native) at Object.app.get.res.send.data [as handle] (/home/ubuntu/workspace/TapToBook.js:35:19) at next_layer (/home/ubuntu/workspace/node_modules/express/lib/router/route.js:103:13) at Route.dispatch (/home/ubuntu/workspace/node_modules/express/lib/router/route.js:107:5) at proto.handle.c (/home/ubuntu/workspace/node_modules/express/lib/router/index.js:195:24) at Function.proto.process_params (/home/ubuntu/workspace/node_modules/express/lib/router/index.js:251:12) at next (/home/ubuntu/workspace/node_modules/express/lib/router/index.js:189:19) at Layer.staticMiddleware [as handle] (/home/ubuntu/workspace/node_modules/express/node_modules/serve-static/index.js:55:61) at trim_prefix (/home/ubuntu/workspace/node_modules/express/lib/router/index.js:226:17) at proto.handle.c (/home/ubuntu/workspace/node_modules/express/lib/router/index.js:198:9)

Also je nachdem, was Sie für verwenden, um Pakete Erholung, können Sie ungültige JSON als String übergeben, aber es nicht verwenden.

+0

Danke für Ihre Antwort. Ich würde es vorziehen, die Antwort als Funktionstest mit einem der in der Frage genannten Pakete zu haben. Seitdem habe ich herausgefunden, wie man es mit Supertests macht. – alefteris

+0

@alefteris. Kein Problem, Kumpel –

1

Ich gehe davon aus, dass Ihr Test validieren möchte der Server behandelt ungültige JSON (und stürzt nicht ab). Hoffentlich eine 400 schlechte Anfrage zurückgeben.

Da ein POST in HTTP nur eine Zeichenfolge ist, besteht eine Option für den Test darin, eine API zu verwenden, die die Bereitstellung eines JSON-Objekts erfordert.

Wenn Sie rohe Knoten http verwenden, können Sie, was ungültige Zeichenfolge Sie möchten senden:

How to make an HTTP POST request in node.js?

Es gibt auch die beliebte Anfrage Bibliothek.

https://github.com/request/request

Zum Beispiel mit der Bibliothek, Ihr Test könnte den ungültigen Inhalt aus einer Datei und Post oder setzte abholen. Aus ihrer docs:

fs.createReadStream('file.json').pipe(request.put('http://example.com/obj.json')) 
+0

Vielen Dank für Ihre Antwort. Ich dachte nicht daran, das Anfragepaket direkt in Tests zu verwenden. Ich würde jedoch bevorzugen, wenn das Codebeispiel in der Antwort ein voll funktionierender Funktionstest wäre, vorzugsweise ohne Verwendung einer externen Datei zum Speichern des ungültigen JSON.Ich habe herausgefunden, wie man es mit Supertest/Superagent macht, aber die Anfrage API scheint nicht sehr anders, so könnte man es auch mit diesem hier machen. – alefteris