2013-08-20 8 views
5

afterを使用してデータベースを削除しようとすると(テストの最後に)機能します。Mochaテストを実行する前に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)でそれを行うことができます。それはまた、モデルを破壊しませんが、彼らのentitesをクリアします。 –

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(); 
        } 
    }); 
    
関連する問題