2013-08-20 2 views
5

Если я попытаюсь сбросить базу данных с помощью after (в конце моих тестов), это сработает.Падение базы данных MongoDB перед запуском теста Mocha

Если я стараюсь следующее:

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

Вы можете сделать это с помощью [mongo-interlude] (https://www.npmjs.com/package/mongo-interlude), просто передав адаптер mongoose в функцию 'cleanDb'. Он также не разрушает модели, но очищает их entites. –

3

Я реализовал это немного иначе.

  1. Я удалил все документы в крючке «до» - нашел это намного быстрее, чем 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(); 
        } 
    });