Async Mocha:`done`调用,但下一个测试永远不会运行

时间:2016-11-11 15:38:15

标签: javascript node.js asynchronous mocha rethinkdb

我有一个非常规的设置我无法改变。它看起来像这样:

  1. 测试POST到服务器
  2. 服务器POST到区块链
  3. 区块链更新
  4. 同步脚本更新数据库
  5. 绝对必要的是,在完成整个工作流程之前,我不会在测试之前运行下一个测试,这通常需要2-3秒。以下是使用supertest和chai为该流程编写的测试示例:

    it('should create a user', done => {
      request(server)
        .post(`${API}/signup`)
        .set('Content-Type', 'application/json')
        .send(`{
          "email":"${USER_EMAIL}",
          "password":"${USER_PASSWORD}"
        }`)
        .expect(200)
        .expect(res => {
          expect(res.body.role).to.equal('user');
          expect(res.body.id).to.match(ID_PATTERN);
        })
        .end(_wait(done));
    });
    

    _wait函数是这里的关键问题。如果我用setTimeout非常天真地写它,工作:

    const _wait = cb => () => setTimeout(cb, 5000);
    

    然而,这不是一个很好的解决方案,因为区块链非常难以预测,有时可能需要2-3秒。更好的是观察数据库的变化。值得庆幸的是,数据库是用Rethink编写的,它提供了更新时更新的游标对象。所以这应该很容易,看起来像这样:

    var _wait = cb => () => {
      connector.exec(db => db.table('chain_info').changes())
      .then(cursor => {
        cursor.each((err, change) => {
          cb(err);
          return false;
        });
      });
    };
    

    此设置会破坏测试。尽可能接近done 被调用。任何控制台登录及其周围都会触发,测试本身会记录为已完成,但下一个测试永远不会启动,最终所有内容都会超时:

    Manager API Workflow:
      Account Creation:
        ✓ should create a user (6335ms)
        1) should login an administrator
    
    
    1 passing (1m)
    1 failing
    
    1) Manager API Workflow: Account Creation: should login an administrator:
       Error: timeout of 60000ms exceeded. Ensure the done() callback is being called in this test.
    

    非常感谢任何帮助。我使用的是Mocha 3.1.2,Chai 3.5.0,Supertest 2.0.1和Node 6.9.1。

0 个答案:

没有答案