我正在使用Mocha来使我的测试和异步模块与mongoose一起使用。当我进行简单的测试以从我的生产代码中获取信息时,它可以正常工作。以下代码工作精细:
/lib/main.js
saveClient () {
let user
async.waterfall([
function (callback) {
let firstFunction = 'First'
callback(null)
},
function (callback) {
let userId
let secondFunction = 'second'
async.waterfall([
function (callback) {
callback(null, 'Hi world')
}
], function (err, results) {
if (err) return console.log(err)
userId = results
})
callback(null, userId)
}
], function (err, results) {
if (err) return console.log(err)
user = results
})
return user
}
/test/test-main.js
const main = require('./lib/main')
it('create client', function (done) {
let promiseClient = new Promise(function (resolve, reject) {
resolve(main.saveClient())
})
promiseClient.then(function (result) {
console.log(result)
assert.typeOf(db.saveClient, 'function', 'saveClient is a function')
done()
})
})
在这里,我得到的结果是'Hi world'
但是,当我使用mongoose及其例程实现相同的代码时,我得不到我想要的结果。这是代码:
/lib/main.js
saveClient () {
let user
async.waterfall([
function (callback) {
let conn = LisaClient.connection
conn.on('error', console.error.bind(console, 'connection error...'))
conn.once('open', function (err, db) {
if (err) return console.log('error')
callback(null)
})
},
function (callback) {
let userId
let ClientSchema = new LisaSchema({ })
let Client = LisaClient.model('Client', ClientSchema)
let client = new Client({ })
async.waterfall([
function (callback) {
client.save().then(callback(null, client._id))
}
], function (err, results) {
if (err) return console.log(err)
userId = results
})
callback(null, userId)
}
], function (err, results) {
if (err) return console.log(err)
user = results
})
return user
}
/test/test-main.js
const main = require('./lib/main')
it('create client', function (done) {
let promiseClient = new Promise(function (resolve, reject) {
resolve(main.saveClient())
})
promiseClient.then(function (result) {
console.log(result)
assert.typeOf(db.saveClient, 'function', 'saveClient is a function')
done()
})
})
在最后一次测试中,我总是得到'未定义'。我认为是因为mocha不等待解析main.saveClient()。我能做什么?。我使用了async / await,得到了相同的结果