Javascript Async Mocha:'done'已调用,但下一个测试从未运行

Javascript Async Mocha:'done'已调用,但下一个测试从未运行,javascript,node.js,asynchronous,mocha.js,rethinkdb,Javascript,Node.js,Asynchronous,Mocha.js,Rethinkdb,我有一个非传统的设置,我不能改变。它看起来像这样: var _wait = cb => () => { connector.exec(db => db.table('chain_info').changes()) .then(cursor => { cursor.each((err, change) => { cb(err); return false; }); }); }; 向服务器发送测试邮件 服务器发布到区

我有一个非传统的设置,我不能改变。它看起来像这样:

var _wait = cb => () => {
  connector.exec(db => db.table('chain_info').changes())
  .then(cursor => {
    cursor.each((err, change) => {
      cb(err);
      return false;
    });
  });
};
  • 向服务器发送测试邮件
  • 服务器发布到区块链
  • 区块链更新
  • 同步脚本更新数据库
  • 在测试完成整个工作流之前,我绝对不能运行下一个测试,这通常需要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));
    });
    
    等待功能是这里的关键问题。如果我非常天真地使用setTimeout编写它,它将起作用:

    然而,这不是一个很好的解决方案,因为区块链是非常不可预测的,有时可能需要2-3秒以上。更好的方法是观察数据库的变化。谢天谢地,这个数据库是用Reinspect编写的,它提供了游标对象,可以根据更改进行更新。这应该很容易,看起来像这样:

    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。

    我无法连续读取所有这些箭头函数。使用所有这些箭头时,
    \u wait
    函数会是什么样子?(在我的生活中ES6还不够!)你为什么说“下一次考试永远不会开始”?您在问题中显示的输出表明下一次测试永远不会结束。我在输出中没有看到任何东西表明它没有启动。@clay:这是一个返回函数的函数。因此它相当于:
    var\u wait=function(cb){return function(){connector.exec…};}@Louis这是一个公平的观点,但无论下一个测试是什么,这个问题都存在。您可以复制并粘贴该用户测试两次,第一次将通过,但第二次将超时。我无法一行读取所有这些箭头函数。使用所有这些箭头时,
    \u wait
    函数会是什么样子?(在我的生活中ES6还不够!)你为什么说“下一次考试永远不会开始”?您在问题中显示的输出表明下一次测试永远不会结束。我在输出中没有看到任何东西表明它没有启动。@clay:这是一个返回函数的函数。因此它相当于:
    var\u wait=function(cb){return function(){connector.exec…};}@Louis这是一个公平的观点,但无论下一个测试是什么,这个问题都存在。您可以复制并粘贴该用户测试两次,第一次将通过,但第二次将超时。