2012-12-16 6 views
12

Próbuję dowiedzieć się, gdzie umieścić funkcję, aby usunąć bazę danych i zamknąć połączenie po zakończeniu wszystkich testów.gdzie usunąć bazę danych i zamknąć połączenie po wszystkich testach przy użyciu mocha

Oto moje zagnieżdżone testy:

//db.connection.db.dropDatabase(); 
//db.connection.close(); 

describe('User', function(){ 
    beforeEach(function(done){ 
    }); 

    after(function(done){ 
    }); 

    describe('#save()', function(){ 
     beforeEach(function(done){ 
     }); 

     it('should have username property', function(done){ 
      user.save(function(err, user){ 
       done(); 
      }); 
     }); 

     // now try a negative test 
     it('should not save if username is not present', function(done){ 
      user.save(function(err, user){ 
       done(); 
      }); 
     }); 
    }); 

    describe('#find()', function(){ 
     beforeEach(function(done){ 
      user.save(function(err, user){ 
       done(); 
      }); 
     }); 

     it('should find user by email', function(done){ 
      User.findOne({email: fakeUser.email}, function(err, user){ 
       done(); 
      }); 
     }); 

     it('should find user by username', function(done){ 
      User.findOne({username: fakeUser.username}, function(err, user){ 
       done(); 
      }); 
     }); 
    }); 
}); 

Nic nie wydaje się działać. Otrzymuję błąd: timeout 2000ms przekroczyła

Odpowiedz

20

Można zdefiniować „root” after() hak przed 1 describe() obsłużyć Czyszczenie:

after(function (done) { 
    db.connection.db.dropDatabase(function() { 
     db.connection.close(function() { 
      done(); 
     }); 
    }); 
}); 

describe('User', ...); 

jednak błąd dostajesz może być od 3 asynchroniczne haki, które nie informują Mocha, aby kontynuować. Muszą one albo zadzwonić done() lub pominąć argumentu, dzięki czemu mogą one być traktowane jako synchronicznego:

describe('User', function(){ 
    beforeEach(function(done){ // arg = asynchronous 
     done(); 
    }); 

    after(function(done){ 
     done() 
    }); 

    describe('#save()', function(){ 
     beforeEach(function(){ // no arg = synchronous 
     }); 

     // ... 
    }); 
}); 

From the docs:

By adding a callback (usually named done) to it() Mocha will know that it should wait for completion.

+0

Faktycznie, mam ten błąd 2nd czasu pracy make test: '✖ 1 5 testów nie powiodło się: 1) #save użytkownika() "przed każdym" haka: Error: timeout 2000ms przekroczyło ' – chovy

+0

@chovy Daje ci kierunek -" * "przed każdym" hookem ".Tak, masz' beforeEach', który się nie kończy, prawdopodobnie dlatego, że nazwałeś argument aby zaakceptować callback, ale następnie nie wywołuj tego. W przypadku Mocha musisz pozostawić go bez nazwy (0 argumentów) - 'function() {...}' - lub nazwij go i wywołaj - 'function (done) {done();} '. –

+0

Otrzymuję teraz inny błąd: https://gist.github.com/a821 7751061ad6e738b9 1) "mimo wszystko" hak: Błąd: przekroczenie limitu czasu 2000ms – chovy

0

I wdrożone go nieco inaczej.

  1. Usunąłem wszystkie dokumenty w haku "przed" - znalazłem go znacznie szybciej niż dropDatabase().
  2. Użyłem opcji Promise.all(), aby upewnić się, że wszystkie dokumenty zostały usunięte przed wyjściem z haka.

    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(); 
        } 
    }); 
    
Powiązane problemy