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;
});
});
};
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这是一个公平的观点,但无论下一个测试是什么,这个问题都存在。您可以复制并粘贴该用户测试两次,第一次将通过,但第二次将超时。