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?