2013-10-25 7 views
12

Ich habe überall gesucht, um eine Lösung zu finden. Das einzige, was ich gefunden habe, ist ein unbeantworteter Beitrag. Ich entschuldige mich, wenn ich etwas übersehen habe.Node.js/Express/Mocha/Supertest Rest API - leere Anfrage Körper

Das Problem ist, dass, wenn ich versuche, die POST Werte in der /createQuestion API zu bekommen, der Körper leer/undefined ist. Ich bekomme Fehler wie diese Cannot read proprety 'question' of undefined kommt von der API.

Die Express-API:

app.post("/createQuestion", function(req, res) { 
    var questionType = req.body.question.type; 
    var questionText = req.body.question.text; 
    var questionDuringClass = req.body.question.duringClass; 

    // Do a bunch of stuff 

    res.send(response); 
}); 

Der Test:

var should = require('should'); 
    var assert = require('assert'); 
    var request = require('supertest'); 
    var winston = require('winston'); 

    request = request('http://localhost:8080'); 

     describe('Questions', function() { // Test suite 
      before(function(done) { 
       done(); 
      }); 

     it('Should create a freeResponse question', function(done) { // Test case 
     var postData = { 
      "question" : { 
       "type" : "freeResponse", 
       "text" : "This is a test freeResponse question (automated testing)", 
       "duringClass" : "1" 
      } 
     }; 

     request() 
     .post('/createQuestion') 
     .send(postData) 
     .expect(200) 
     .end(function(err, res) { // .end handles the response 
      if (err) { 
       return done(err); 
      } 

      done(); 
     }); 
    }); 

it('Should delete a freeResponse question', function(done) { // Test case 
     var postData = { 
      "question" : { 
       "type" : "freeResponse", 
       "text" : "This is a test freeResponse question (automated testing)", 
       "duringClass" : "1" 
      } 
     }; 

     request() 
     .post('/deleteQuestion') 
     .send(postData) 
     .expect(200) 
     .end(function(err, res) { // .end handles the response 
      if (err) { 
       return done(err); 
      } 

      done(); 
     }); 
    }); 

Was bin ich? Sendet die .send() die POST Daten in einem anderen Format? Ist es nicht POST es an den Körper der Anfrage?

+0

Sie Anfrage (url) haben, wo url definiert? es ist eine App, die Sie zuvor enthalten? – alfonsodev

+0

Oh, richtig. Ich hatte das geändert, bevor ich gepostet habe. Ich habe die Zeile nach oben hinzugefügt, um die URL für die gesamte Anfrage festzulegen, anstatt sie an jeden einzelnen Test zu übergeben. Ich habe die URL-Einträge entfernt. Danke –

+0

bedenken Sie, dass getan() es nur einmal aufgerufen wird, das erste Mal ist es Anruf, es endet Test. – alfonsodev

Antwort

27

Es ist wahrscheinlich, dass Ihre App keine bodyParser-Middleware verwendet.

app.use(express.bodyParser()); 

Aus den Express.js docs:

req.body

Diese Eigenschaft ist ein Objekt der analysierten Anfrage Körper enthält. Diese Funktion wird von der Middleware bodyParser() zur Verfügung gestellt, obwohl auch andere Middleware für Body Parsing diese Konvention befolgen kann. Diese Eigenschaft wird standardmäßig auf {} gesetzt, wenn bodyParser() verwendet wird.

Hier haben Sie ein komplettes Beispiel

var express = require('express'); 
var request = require('supertest'); 

var assert = require('assert'); 
var app = express(); 

app.use(express.bodyParser()); 
app.get('/', function(req, res) { 
    res.send('ok'); 
}); 

app.post('/createQuestion', function(req, res) { 
    var message = req.body.partA + ' ' + req.body.partB; 
    res.send(message); 
}); 

describe('testing a simple application', function() { 
    it('should return code 200', function(done) { 
    request(app) 
     .get('/') 
     .expect(200) 
     .end(function(err, res){ 
     if(err) { 
      done(err); 
     } else { 
      done(); 
     } 
     }); 
    }); 

    it('should return the same sent params concatenated', function(done) { 
    request(app) 
     .post('/createQuestion') 
     .send({ partA: 'Hello', partB: 'World'}) 
     .expect(200, 'Hello World') 
     .end(function(err, res){ 
     if(err) { 
      done(err); 
     } else { 
      done(); 
     } 
     }); 
    }); 

}); 
+0

Vielen Dank. Das war's. Ich schätze das wirklich! –

+2

Das hat auch für mich funktioniert. Für Express 3.x und 4.x sollten Sie _body-parser_ not express.bodyParser() verwenden: 'app.use (require ('body-parser'). Json())' – zayquan