摩卡:超出2000毫秒的错误超时

use*_*173 11 javascript mocha.js node.js ecmascript-6 es6-promise

我正在尝试为数据库进行单元测试.

以下是seed.js文件:

.......
const app = require('./app')
const db = app.get('db')

const saveUsersToDB = (done) => {
    db.User.bulkCreate(users)
         .then(() => (done))
}

module.exports = {saveUsersToDB};
Run Code Online (Sandbox Code Playgroud)

我的app.test.js档案:

.......
const expect = require('expect')
const request = require('supertest')
const {saveUsersToDB} = require('./seed/seed');

before(saveUsersToDB)
Run Code Online (Sandbox Code Playgroud)

当我运行下面的测试是我得到的错误:

Express listening on port 3000!
  1) "before all" hook: saveUsersToDB

  0 passing (2s)
  1 failing

  1)  "before all" hook: saveUsersToDB:
     Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.

npm ERR! Test failed.  See above for more details.
Run Code Online (Sandbox Code Playgroud)

我以为回来.then(() => (done))就足够了?我究竟做错了什么?

Kal*_*man 17

默认情况下,mocha测试有2秒超时(这意味着测试需要在2秒内完成).

您可以增加(以毫秒为单位),如下所示:

this.timeout(5000); // this test can take up to 5 seconds
Run Code Online (Sandbox Code Playgroud)

https://mochajs.org/#timeouts

  • 是的,但在这种情况下调整超时不会有帮助。 (2认同)

Lew*_*wis 12

因为(done)实际上会返回函数而不是调用它.要打电话done,你需要这样写.

.then(() => done())
Run Code Online (Sandbox Code Playgroud)

但是,我不建议done与promises一起使用.您只需返回承诺,然后mocha自动处理它.

const saveUsersToDB = () => db.User.bulkCreate(users)
Run Code Online (Sandbox Code Playgroud)

  • 好点子!你也可以做`.then(done)` (4认同)

sen*_*dra 5

我有同样的感觉。由于2秒超时,因此会提示此错误,因此,如果您的测试需要连接到ddbb,它将证明是最合适的。

我要做的就是将需要外部连接的所有测试都分离到集成测试文件夹中,然后在package.json测试脚本中添加下一个标志:

"int-test": "mocha --timeout 15000 tests/integration/**/*.test.js --compilers js:babel-register "
Run Code Online (Sandbox Code Playgroud)

单击此链接以了解其他增加超时的方法:mocha timout