2015-02-02 12 views
9

Chciałbym przetestować, w jaki sposób interfejs REST API obsługuje żądanie POST zawierające treść z nieprawidłową składnią JSON, na przykład brakujący przecinek. Używam node.js do napisania testów interfejsu API. Używam frisby, ale próbowałem również supertest. Brak szczęścia. Dzięki poprzednim narzędziom przekazujesz treść żądania jako obiekt JavaScript, więc nie ma go. Próbowałem również przekazać niepoprawny JSON jako ciąg bez szczęścia, ponieważ łańcuch jest również prawidłowym JSON (przykład poniżej). Jakieś pomysły?Sprawdź, w jaki sposób interfejs API obsługuje nieprawidłową treść żądania składni JSON za pomocą pliku node.js

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

Czy możesz podać przykłady użytych ciągów i obiektów? – Demurgos

+0

@Demurgos Dodano przykład, dzięki. – alefteris

+1

Jeśli potrzebujesz tego testu, musi wystąpić sytuacja, gdy spodziewasz się wystąpienia tego błędu. Czy możesz podać scenariusz wystąpienia tego błędu? – freele

Odpowiedz

4

Korzystanie pakiety supertest i mokka, można przetestować punkt końcowy zamieszczając nieprawidłowy JSON tak:

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(); 
     }); 
    }); 
}); 

Ważne tutaj jest nieco type(json). Spowoduje to ustawienie typu zawartości żądania dla aplikacji/json. Bez niego supertest/superagent domyślnie wysyła ciągi znaków jako application/x-www-form-urlencoded. Również niepoprawny JSON jest dostarczany jako ciąg, a nie jako obiekt JavaScript.

3

nigdy nie używane Frisby lub superagent, ale uważam, że istnieją dwa pytania tutaj:

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

co nie jest możliwe, ponieważ zostanie ona wkrótce odrzucane po stronie klienta samego, a ty otrzyma błąd przed wysłaniem żądania POST do serwera. (Bo jak są tylko ciągi podczas pracy z http, klient sam spróbować stringify JSON, gdzie będzie on utknąć z nieprawidłową JSON)

2. pass an invalid JSON just as a string

przykład: post ciąg tak przy użyciu 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); 
    }); 

To skutecznie przekazuje nieprawidłowy JSON (w tym przypadku nazwę) do serwera jako srting. Ale będzie to wymagało przeanalizowania ciągu znaków w JSON przy użyciu JSON.parse(), zanim będzie można z niego korzystać. I podczas próby, aby uzyskać w ten sposób:

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)

Więc cokolwiek pakiety używać do Reszta, można przekazać nieprawidłową JSON jako ciąg, ale nie używaj go.

+0

Dzięki za odpowiedź. Wolałbym mieć odpowiedź jako test funkcjonalny z jednym z pakietów wymienionych w pytaniu. Od tego czasu wymyśliłem, jak to zrobić, przynajmniej z supertestem. – alefteris

+0

@alefteris. Nie ma problemu, kolego –

1

Zakładam, że test ma na celu sprawdzenie, czy serwer obsługuje nieprawidłowy JSON (i nie ulega awarii). Mam nadzieję, że zwrócimy 400 złych wniosków.

Ponieważ POST w http to tylko ciąg, opcja testu polega na użyciu interfejsu API, który wymaga dostarczenia obiektu JSON.

Jeśli używasz surowego węzła http, to można wysłać cokolwiek nieprawidłowy ciąg chcesz:

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

Jest również popularna biblioteka żądanie.

https://github.com/request/request

Na przykład, w bibliotece, nasz test mógłby odebrać niepoprawną zawartość z pliku i pocztą lub umieścić. Z ich dokumentów:

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

Dziękuję za odpowiedź. Nie myślałem o korzystaniu z pakietu żądania bezpośrednio w testach. Wolałbym jednak, jeśli przykład kodu w odpowiedzi byłby pełnym funkcjonalnym testem funkcjonalnym, najlepiej bez użycia zewnętrznego pliku do przechowywania nieprawidłowego JSON. Pomyślałem, jak to zrobić z supertest/superagentem, ale API żądania nie wydaje się bardzo inny, więc można to zrobić również z tym, jak sądzę. – alefteris

Powiązane problemy