摩卡不会等到完成之前

时间:2017-10-13 15:19:08

标签: node.js mocha

我的mocha测试中有这个方法before,它准备数据库进行测试:

before(() => {
        db.User.destroy({where: {}})
            .then(db.User.create({id: 1, username: 'foo', password: 'secret', email: 'foo@local.dev'}))
            .then(db.Post.destroy({where: {}}))
            .then(() => {
                db.Post.create({id: 1, title: 'Foo', markdown: 'Bar', authorId: 1, published: true});
                db.Post.create({id: 2, title: 'Bar', markdown: 'Foo', authorId: 1, published: false});
            })
            .catch(err => console.err(err));
    });

我的第一个测试很简单:

describe('[GET] /posts', () => {
        it('expect to GET all posts', done => {
            chai.request(server)
                .get('/posts')
                .end((err, res) => {
                    expect(err).to.be.null;

                    expect(res).to.have.status(200);
                    expect(res).to.be.json;
                    expect(res.body.length).to.be.equal(2);

                    done();
                });
        });
    });

它不起作用,我的res.body.length等于0.第二个测试:

describe('[GET] /posts?published=:bool', () => {
        it('expect to GET all published posts', done => {
            chai.request(server)
                .get('/posts?published=true')
                .end((err, res) => {
                    expect(err).to.be.null;

                    expect(res).to.have.status(200);
                    expect(res).to.be.json;
                    expect(res.body.length).to.be.equal(1);

                    done();
                });
        });

按预期工作,结果在这里。最后,当我检查我的数据库时,这两个帖子就在这里。当我在地址/posts上使用邮递员时,它也可以按预期工作......

2 个答案:

答案 0 :(得分:4)

你的before正在运行异步代码,但你并没有告诉Mocha它是。

您可以从中返回承诺链(Mocha支持承诺作为done回调的替代方案):

before(() => {
  return db.user.destroy({where: {}})
    .then(db.user.create({id: 1, username: 'foo', password: 'secret', email: 'foo@local.dev'}))
    .then(db.post.destroy({where: {}}))
    .then(() => {
      db.post.create({id: 1, title: 'foo', markdown: 'bar', authorid: 1, published: true});
      db.post.create({id: 2, title: 'bar', markdown: 'foo', authorid: 1, published: false});
    });
});

(Mocha也将捕获任何异常,因此无需添加.catch

答案 1 :(得分:1)

你需要告诉Mocha你已经完成了。 Mocha有一个done()回调你可以使用。但在这种情况下,你最好只从db调用中返回promise:

return before(() => {
    db.User.destroy({where: {}})
    // etc ...
})

摩卡将继续等待承诺解决。