Node.js 在摩卡测试中使用Superagent/Supertest和Express app
我正在尝试使用Mocha为我正在开发的RESTAPI编写测试。我发现Superagent允许我进行HTTP请求。我使用的是一个Express应用程序,我将其传递给Superagent,但当我尝试使用以这种方式传递的Express应用程序运行这些测试时,我会遇到关于Mongoose的奇怪错误。以下是我的测试代码:Node.js 在摩卡测试中使用Superagent/Supertest和Express app,node.js,express,mongoose,mocha.js,superagent,Node.js,Express,Mongoose,Mocha.js,Superagent,我正在尝试使用Mocha为我正在开发的RESTAPI编写测试。我发现Superagent允许我进行HTTP请求。我使用的是一个Express应用程序,我将其传递给Superagent,但当我尝试使用以这种方式传递的Express应用程序运行这些测试时,我会遇到关于Mongoose的奇怪错误。以下是我的测试代码: var // Node modules mongoose = require('mongoose') , async = require('async') , s
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()
})
})
})
我得到的错误是:
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)
然而,这个错误只是偶尔出现。1/5次,测试将顺利通过。这让我觉得测试有时是在app
完全加载之前运行的
或者,如果我在单独的会话中运行应用程序,只需将URL传递到请求
,如下图所示,则每次都可以运行:
request=request('http://localhost:3000)
这就是原因吗?如果是这样的话,我怎么能只在
app
完全加载后运行测试呢?结果表明,我必须在测试之前指定一个,以等待MongoDB连接打开,然后再运行测试
before(function (done) {
mongoose.connection.on('open', done)
})
我认为express服务器在db连接完成之前不开始监听也是一个很好的做法