我的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
上使用邮递员时,它也可以按预期工作......
答案 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 ...
})
摩卡将继续等待承诺解决。