代码之家  ›  专栏  ›  技术社区  ›  BrDaHa

Mocha测试失败,错误来自“所有之前”挂钩

  •  8
  • BrDaHa  · 技术社区  · 7 年前

    据我所知,如果在 before 方法:

    > $(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)
      }
    })
    

    从注释掉的代码中,您可以看到服务器有一个异步操作,我需要在服务器实际开始侦听之前完成该操作。唯一有效的方法是在 之前 阻止和任一调用 done() 立即在 之前 函数,或传递不带参数的函数。但是,这仍然是一个问题,因为测试开始时服务器尚未初始化。

    令人抓狂的是,当我连接到调试器时,这段代码可以正常工作,所以我甚至无法检查以查看出了什么问题。

    2 回复  |  直到 7 年前
        1
  •  11
  •   BrDaHa    7 年前

    当我发布这个问题时,我无意中发现 this bug 这让我发现我需要打电话 this.enableTimeouts(false) before 功能,如:

    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)
        })
    })
    

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

        2
  •  1
  •   Mustafa Karcıoğlu    6 年前

    有一段时间没有被问及这个问题了,但对于未来的读者,我们来看看:

    您可以使用运行测试 mocha test/*.js --timeout 5000 命令就是这样。

    但是如果你用 npm test 命令,只需编辑 package.json 文件 就像这样:

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