Respuesta de chai. El cuerpo está siempre vacío {}

No importa lo que realmente devuelva mi servidor, Chai siempre me da esta excepción cuando afirmo response.body:

Error de aserción no capturado: se esperaba que {} fuera ‘prueba’ profundamente igual

Aunque la respuesta real del servidor es ‘prueba’, no {}: introduzca la descripción de la imagen aquí

Aquí está mi prueba:

const chai = require('chai'); const chaiHttp = require('chai-http'); const server = require('./test-server'); const should = chai.should(); chai.use(chaiHttp); describe('GET /test', () => { it('it should give test result', (done) => { chai.request(server) .get('/test') .end((err, res) => { console.log(err); // outputs null console.log(res); // outputs normal-looking response res.body.should.be.eql('test'); done(); }); }); }); 

Aquí está mi servidor (test-server.js):

 const http = require('http'); const server = http.createServer(function (request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); response.end('test'); }); module.exports = server; server.listen(process.env.PORT || 8000); console.log("Server running at http://localhost:8000/"); 

¿Qué estoy haciendo mal?

Tipo de contenido: application/json

res.body se rellena según el encabezado Content-Type

test-server.js

 const http = require('http'); const server = http.createServer(function (request, response) { response.writeHead(200, {"Content-Type": "application/json"}); var b = JSON.stringify({ name: 'asad', class: 'paewe' }); response.end(b); }); module.exports = server; server.listen(process.env.PORT || 8000); console.log("Server running at http://localhost:8000/"); 

El res.body contendrá el objeto analizado.

test.js

 const chai = require('chai'); const chaiHttp = require('chai-http'); const server = require('./test-server'); const should = chai.should(); chai.use(chaiHttp); describe('GET /test', () => { it('it should give test result', (done) => { chai.request(server) .get('/test') .end((err, res) => { console.log(err); // outputs null console.log(res); // outputs normal-looking response console.log(res.body) // { name: 'asad', class: 'paewe' } var checkObj = { name: 'asad', class: 'paewe' } res.body.should.be.eql(checkObj); // passes test done(); }); }); }); 

————————————————– ————————————————– —-

Tipo de contenido: text/plain

Si el encabezado Content-Type es text/plain , entonces el cuerpo de la respuesta no se analizará como nada, pero res.text contendrá los datos como una cadena

test-server.js

 const http = require('http'); const server = http.createServer(function (request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); response.end('test'); }); module.exports = server; server.listen(process.env.PORT || 8000); console.log("Server running at http://localhost:8000/"); 

test.js

 const chai = require('chai'); const chaiHttp = require('chai-http'); const server = require('./test-server'); const should = chai.should(); chai.use(chaiHttp); describe('GET /test', () => { it('it should give test result', (done) => { chai.request(server) .get('/test') .end((err, res) => { console.log(err); // outputs null console.log(res); // outputs normal-looking response console.log(res.body) // {} res.text.should.be.eql('test'); // passes test done(); }); }); }); 

Algunas referencias

  1. https://github.com/visionmedia/superagent/issues/990
  2. https://github.com/visionmedia/supertest/pull/10
  3. https://github.com/visionmedia/supertest/issues/68