Mocha 测试因 "before all" 钩子错误而失败
Mocha test fails with error from "before all" hook
据我了解,如果 before
方法中发生某些错误,mocha 测试框架将抛出此错误:
> $(npm bin)/mocha test/*.js
1) "before all" hook
我尝试了很多不同的方法来尝试捕捉这个错误,但似乎没有任何效果:
before(function(done) {
server = require('../app')
try {
server.listen(process.env.PORT)
done()
// server.initialize()
// .then(() => {
// console.info('listening on', process.env.PORT)
// server.listen(process.env.PORT, done)
// })
// .catch(err => {
// console.log(err)
// done(err)
// })
} catch (err) {
console.log('outer error', err)
done(err)
}
})
从注释掉的代码可以看出,服务器有一个异步操作需要我在服务器真正开始监听之前完成。唯一似乎有效的是在 before
块之外初始化服务器,然后在 before
函数中立即调用 done()
,或者传递一个不接受范围。然而,这仍然是一个问题,因为服务器在测试开始时尚未初始化。
令人抓狂的是,当我连接到调试器时这段代码有效,所以我什至无法检查出问题所在。
当我发布这个问题时,我偶然发现了 this bug,这让我发现我需要在 before
函数的开头调用 this.enableTimeouts(false)
,像这样:
let server
before(function(done) {
this.enableTimeouts(false) <----
server = require('../app')
server.initialize()
.then(() => {
console.info('listening on', process.env.PORT)
server.listen(process.env.PORT, done)
})
.catch(err => {
console.log(err)
done(err)
})
})
希望这可以帮助其他人进行几个小时的调试。
自问到这个问题已经有一段时间了,但对于未来的读者,我们开始了:
您可以 运行 使用 mocha test/*.js --timeout 5000
命令进行测试。就是这样。
但是如果您 运行 使用 npm test
命令进行测试,只需编辑 package.json
文件
像那样:
"scripts": {
"start": "nodemon ./bin/www",
"test": "mocha --exit --recursive --timeout 5000" // add this line
}
据我了解,如果 before
方法中发生某些错误,mocha 测试框架将抛出此错误:
> $(npm bin)/mocha test/*.js
1) "before all" hook
我尝试了很多不同的方法来尝试捕捉这个错误,但似乎没有任何效果:
before(function(done) {
server = require('../app')
try {
server.listen(process.env.PORT)
done()
// server.initialize()
// .then(() => {
// console.info('listening on', process.env.PORT)
// server.listen(process.env.PORT, done)
// })
// .catch(err => {
// console.log(err)
// done(err)
// })
} catch (err) {
console.log('outer error', err)
done(err)
}
})
从注释掉的代码可以看出,服务器有一个异步操作需要我在服务器真正开始监听之前完成。唯一似乎有效的是在 before
块之外初始化服务器,然后在 before
函数中立即调用 done()
,或者传递一个不接受范围。然而,这仍然是一个问题,因为服务器在测试开始时尚未初始化。
令人抓狂的是,当我连接到调试器时这段代码有效,所以我什至无法检查出问题所在。
当我发布这个问题时,我偶然发现了 this bug,这让我发现我需要在 before
函数的开头调用 this.enableTimeouts(false)
,像这样:
let server
before(function(done) {
this.enableTimeouts(false) <----
server = require('../app')
server.initialize()
.then(() => {
console.info('listening on', process.env.PORT)
server.listen(process.env.PORT, done)
})
.catch(err => {
console.log(err)
done(err)
})
})
希望这可以帮助其他人进行几个小时的调试。
自问到这个问题已经有一段时间了,但对于未来的读者,我们开始了:
您可以 运行 使用 mocha test/*.js --timeout 5000
命令进行测试。就是这样。
但是如果您 运行 使用 npm test
命令进行测试,只需编辑 package.json
文件
像那样:
"scripts": {
"start": "nodemon ./bin/www",
"test": "mocha --exit --recursive --timeout 5000" // add this line
}