res.Körper ist leer, die in diesem test verwendet supertest und Node.js
Ich bin testen Node.js API mit supertest, und ich kann nicht erklären, warum die res.body
Objekt Obermenge zurückkehrt, ist leer. Die Daten zeigen, bis in der res.text
Objekt, aber nicht res.body
, eine Idee, wie man dieses Problem beheben?
Ich bin mit Express und body-parser
:
app.use(bodyParser.json());
app.use(bodyParser.json({ type: jsonMimeType }));
app.use(bodyParser.urlencoded({ extended: true }));
Hier ist die API-Methode, die ich am testen:
app.get(apiPath + '/menu', function(req, res) {
var expiration = getExpiration();
res.set({
'Content-Type': jsonMimeType,
'Content-Length': jsonTestData.length,
'Last-Modified': new Date(),
'Expires': expiration,
'ETag': null
});
res.json({ items: jsonTestData });
}
Hier sind die tests, die ich bin, die auf diese API-Methode:
describe('GET /menu', function() {
describe('HTTP headers', function() {
it('responds with the right MIME type', function(done) {
request(app)
.get(apiPath + '/menu')
.set('Accept', 'application/vnd.burgers.api+json')
.expect('Content-Type', 'application/vnd.burgers.api+json; charset=utf-8')
.expect(200, done);
});
it('responds with the right expiration date', function(done) {
var tomorrow = new Date();
tomorrow.setDate(tomorrow.getDate() + 1);
tomorrow.setHours(0,0,0,0);
request(app)
.get(apiPath + '/menu')
.set('Accept', 'application/vnd.burgers.api+json; charset=utf-8')
.expect('Expires', tomorrow.toUTCString())
.expect(200, done);
});
it('responds with menu items', function(done) {
request(app)
.get(apiPath + '/menu')
.set('Accept', 'application/vnd.burgers.api+json; charset=utf-8')
.expect(200)
.expect(function (res) {
console.log(res);
res.body.items.length.should.be.above(0);
})
.end(done);
});
});
});
Den Fehler erhalte ich:
1) GET /menu HTTP headers responds with menu items:
TypeError: Cannot read property 'length' of undefined
at /Users/brian/Development/demos/burgers/menu/test/MenuApiTest.js:42:25
at Test.assert (/Users/brian/Development/demos/burgers/menu/node_modules/supertest/lib/test.js:213:13)
at Server.assert (/Users/brian/Development/demos/burgers/menu/node_modules/supertest/lib/test.js:132:12)
at Server.g (events.js:180:16)
at Server.emit (events.js:92:17)
at net.js:1276:10
at process._tickDomainCallback (node.js:463:13)
Und schließlich, hier ist ein Auszug aus dem Ergebnis der console.log(res)
:
...
text: '{"items":[{"id":"1","name":"cheeseburger","price":3},{"id":"2","name":"hamburger","price":2.5},{"id":"3","name":"veggie burger","price":3},{"id":"4","name":"large fries","price":2},{"id":"5","name":"medium fries","price":1.5},{"id":"6","name":"small fries","price":1},{"id":"7","name":"large drink","price":2.5},{"id":"8","name":"medium drink","price":2},{"id":"9","name":"small drink","price":1}]}',
body: {},
...
- Ich weiß nicht, die test-framework, aber die Frage die ich habe ist, was genau ist res, wenn Sie bei der Konsole.log(res)? Wie es aussieht ist es nur eine string-Repräsentation des Arrays. Also, vielleicht ist JSON.parse(res)...
res
ist das response-Objekt die Ergebnisse aus der Anfrage. Pro Dokumentation - supertest, nur übergibt Sie das response-Objekt durch, um die callback-Funktion.- Du bist serialisieren der Antwort mit res.json() richtig? Und Ihre api für die rechnen-Funktion besagt, dass es erwartet einen string, regex, oder analysierten Körper-Objekt github.com/visionmedia/supertest#expectbody-fn
- Ja, ich bin serialisieren der Antwort. Aber die
expect(body, [fn])
Sie verwiesen wird, ist nicht die Methode, die ich verwende. Ich benutze.expect(function(res) {})
. Die Dokumentation für diese Methode besagt: "Übergeben Sie einen benutzerdefinierten Behauptung Funktion. Sie erhalten die response-Objekt zu überprüfen. Wenn die Antwort ok ist, sollte es wieder falsy, meist nicht zurückgeben, nichts. Wenn der check fehlschlägt, wird ein Fehler ausgelöst oder der Rückgabe einer truthy Wert wie ein string, werden verwandelt werden in ein Fehler." Ein Beispiel finden Sie hier.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Basiert auf den folgenden test, den Sie erwarten, 'application/vnd.Burger.api+json; charset=utf-8' als Content-Type:
Dieser express-Strecke zeigt Ihnen ebenfalls die Einstellung des headers, um einen benutzerdefinierten Wert, jsonMimeType:
Wenn dies der Fall ist, supertest isnt going to parse JSON automatisch für Sie. Der content-type-header muss beginnen mit der Zeichenfolge "application/json'. Wenn Sie nicht machen dies geschehen, dann müssen Sie verwenden das JSON-Format.parse-Funktion selbst zu konvertieren, dass text-string in ein Objekt.
supertest verwendet diese Datei, um zu bestimmen, wenn Sie das senden von json oder nicht. Unter der Haube supertest tatsächlich startet Ihre express server, macht der eine Anfrage über HTTP, und schnell schaltet es nach unten. Nach, dass die HTTP-übergabe der client-Seite (das ist im Grunde superagent) der HTTP-request nicht wissen, etwas über Ihre server-Konfiguration mit Bezug auf " application/vnd.Burger.api+json; charset=utf-8'. Alle es wissen, was ist gesagt über Header, in diesem Fall content-type.
Ausserdem wollte ich versuchen, Ihre benutzerdefinierten header auf meinem Rechner und ich bekam auch einen leeren Körper.
Edit: aktualisierte Tabelle link wie bereits in den Kommentaren
node-mime
geschaltet hat mitmime-db
für seine mime-Typ der Daten. Finden Sie die JSON-Daten hier.Dieser ist alt, aber es hat mir geholfen, so dachte, ich würde teilen einige Kenntnisse.
Durcharbeitung von mattr Beispiel, fand ich, dass die Informationen tatsächlich in die res.text, nicht die ee.Körper.
Ich landete Zugabe von etwas besonderen Umgang:
Mein problem war, dass die
.set()
Methode setzen der request-Header, in der Erwägung, dass.send()
wird die request-body mit der json-Daten, die Sie angeben.Fix:
hinzufügen
diese akzeptieren json content-Typen: -)