我有一个非常规的设置我无法改变。它看起来像这样:
绝对必要的是,在完成整个工作流程之前,我不会在测试之前运行下一个测试,这通常需要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。