2013-08-20 53 views
5

如果我嘗試使用after(在我的測試結束時)刪除數據庫,它可以工作。在運行摩卡測試之前刪除MongoDB數據庫

如果我嘗試以下方法:

var db = mongoose.connect('mongodb://localhost/db-test') 

describe('Database', function() { 

    before(function (done) { 
     db.connection.db.dropDatabase(function(){ 
      done() 
     }) 
    }) 

    ... 

它不會刪除數據庫。到底是怎麼回事?我希望在開始測試之前放棄db,這樣在測試之後,我可以探索db。

回答

11

通過連接解決另一個定義..不知道是否理想。

describe('Init', function() { 

    before(function (done) { 
     mongoose.connect('mongodb://localhost/db-test', function(){ 
      mongoose.connection.db.dropDatabase(function(){ 
       done() 
      })  
     }) 
    }) 

    describe('Database', function() { 
+0

我有同樣的問題。我的猜測是,在開始測試時連接還沒有可用。 – Jorre

+0

只需將您的mongoose適配器傳遞給'cleanDb'函數,就可以使用[mongo-interlude](https://www.npmjs.com/package/mongo-interlude)完成。它也不會破壞模型,但清除它們的實體。 –

3

我實現它有點不同。

  1. 我刪除了「before」鉤子中的所有文檔 - 發現它比dropDatabase()快得多。
  2. 我使用Promise.all()來確保在退出掛鉤之前刪除所有文檔。

    beforeEach(function (done) { 
    
        function clearDB() { 
         var promises = [ 
          Model1.remove().exec(), 
          Model2.remove().exec(), 
          Model3.remove().exec() 
         ]; 
    
         Promise.all(promises) 
          .then(function() { 
           done(); 
          }) 
        } 
    
        if (mongoose.connection.readyState === 0) { 
         mongoose.connect(config.dbUrl, function (err) { 
          if (err) { 
           throw err; 
          } 
          return clearDB(); 
         }); 
        } else { 
         return clearDB(); 
        } 
    }); 
    
相關問題