2017-10-13 72 views
0

我有這樣的方法before在我的摩卡測試,其測試準備數據庫:摩卡沒有等到前完成

before(() => { 
     db.User.destroy({where: {}}) 
      .then(db.User.create({id: 1, username: 'foo', password: 'secret', email: '[email protected]'})) 
      .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

before運行異步代碼,但你不能告訴摩卡它。

你可以從它返回的承諾鏈(摩卡支持的承諾作爲替代done回調):

before(() => { 
    return db.user.destroy({where: {}}) 
    .then(db.user.create({id: 1, username: 'foo', password: 'secret', email: '[email protected]'})) 
    .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

1

你需要告訴摩卡,你就完成了。摩卡有一個done()回調你可以使用。但在這種情況下,你是關閉從DB調用返回剛纔的承諾更好:

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

摩卡將等待承諾在移動之前解決。