NodeJS Mocha测试失败,错误来自“before all”钩子

e0bqpujr  于 2023-03-17  发布在  Node.js
关注(0)|答案(3)|浏览(155)

据我所知,如果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(),或者传递一个不带参数的函数,但是这仍然是一个问题,因为在测试开始时服务器还没有初始化。
令人抓狂的是,当我连接到调试器时,这段代码仍然有效,所以我甚至无法检查出了什么问题。

guz6ccqo

guz6ccqo1#

当我发布这个问题时,我偶然发现了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)
    })
})

希望这能帮助其他人进行几个小时的调试。

p5fdfcr1

p5fdfcr12#

它已经有一点时间,因为它被要求,但为未来的读者在这里,我们去:
您可以使用mocha test/*.js --timeout 5000命令运行测试,仅此而已。
但是如果您使用npm test命令运行测试,只需像这样编辑您的package.json文件:

"scripts": {
    "start": "nodemon ./bin/www",
    "test": "mocha --exit --recursive --timeout 5000" // add this line
  }
5fjcxozz

5fjcxozz3#

不知道是否有人仍然看这个线程,但我仍然有超时的错误,有趣的是试图运行测试两次工程.使用摩卡茶测试的Express应用程序试图让续集销毁.这是我认为导致错误的一部分:
“1)/reader在所有”挂钩“/reader之前”
验证错误

describe("/readers",()=>{before(async()=>Reader.sequelize.sync()); beforeEach(async () =>{await Reader.destroy({where:{}})})});

相关问题