node.js express mongoose mocha superagent

node.js - Usar Superagent/Supertest con la aplicación Express en pruebas de Mocha



supertest mocha chai (1)

Resulta que tuve que especificar una prueba before de esperar a que se abra la conexión MongoDB antes de ejecutar las pruebas.

before(function (done) { mongoose.connection.on(''open'', done) })

Estoy intentando escribir pruebas para la API REST que estoy desarrollando, usando Mocha. Descubrí Superagent que me permite hacer solicitudes HTTP. Estoy usando una aplicación Express, que paso a Superagent, pero recibo extraños errores sobre Mongoose al intentar ejecutar estas pruebas con la aplicación Express pasada de esta manera. Aquí está mi código para las pruebas:

var // Node modules mongoose = require(''mongoose'') , async = require(''async'') , should = require(''should'') , request = require(''superagent'') , app = require(''../../app_mocked'') , Link = mongoose.model(''Link'') request = request(app) describe(''Links resource'', function () { var userId = ''50dc81654dca01006b000005'' , linkId , sampleLink = { ''uri'': ''http://test.com/'', ''meta'': { ''title'': ''Test'', ''desc'': ''Test link desc'' }, ''shares'': [{ ''uid'': userId, ''date'': new Date(), ''message'': ''Test link message'' }] } it(''POST /api/users/:id/links'', function (done) { request(app).post(''/api/users/'' + userId + ''/links'') .send(sampleLink) .end(function (err, res) { res.should.have.status(200) res.body.should.have.property(''id'') linkId = res.body.id done() }) }) it(''GET /api/users/:id/links'', function (done) { request(app).get(''/api/users/50dc81654dca01006b000005/links'') .end(function (err, res) { res.should.have.status(200) res.body.should.have.lengthOf(1) done() }) }) })

El error que recibo es esto:

1) Links resource POST /api/users/:id/links: TypeError: Cannot call method ''update'' of null at MongoStore.MONGOSTORE.set (/Users/Oliver/Development/Personal/Reader/node_modules/connect-mongodb/lib/connect-mongodb.js:146:15) at Session.save (/Users/Oliver/Development/Personal/Reader/node_modules/express/node_modules/connect/lib/middleware/session/session.js:63:25) at ServerResponse.res.end (/Users/Oliver/Development/Personal/Reader/node_modules/express/node_modules/connect/lib/middleware/session.js:280:19) at ServerResponse.res.send (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/response.js:149:8) at ServerResponse.res.json (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/response.js:191:15) at ServerResponse.res.send (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/response.js:117:21) at Promise.exports.create (/Users/Oliver/Development/Personal/Reader/server/resources/links.js:29:9)

Sin embargo, este error solo aparece algunas veces. 1/5 veces, las pruebas pasarán sin ningún problema. Esto me hace pensar que las pruebas a veces se ejecutan antes de que la app haya cargado por completo.

Alternativamente, si ejecuto la aplicación en una sesión separada y solo paso la URL para request , como a continuación, entonces funciona siempre:

request = request(''http://localhost:3000'')

¿Es esta la razón por la cual? Si es así, ¿cómo solo puedo ejecutar las pruebas una vez que la app haya cargado por completo?