2013-08-20 3 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를 삭제하는 것을 선호합니다. 따라서 테스트를 마친 후에 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

몽구스 어댑터를'cleanDb' 함수에 전달하기 만하면 [mongo-interlude] (https://www.npmjs.com/package/mongo-interlude)로 할 수 있습니다. 그것은 또한 모델을 파괴하지는 않지만 그들의 유혹을 제거합니다. –

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(); 
        } 
    }); 
    
관련 문제