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.
InformationsquelleAutor blundin | 2014-10-17
Schreibe einen Kommentar