Где удалять базу данных и закрывать соединение после всех тестов с использованием мокко
Я пытаюсь выяснить, куда поместить функцию для удаления базы данных и закрытия соединения после выполнения всех тестов.
Вот мои вложенные тесты:
//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();
});
});
});
});
Кажется, что ничего не работает. Я получаю сообщение об ошибке: время ожидания превышено 2000 м.
Ответы
Ответ 1
Вы можете определить крюк "root" after()
до 1-го describe()
для обработки очистки:
after(function (done) {
db.connection.db.dropDatabase(function () {
db.connection.close(function () {
done();
});
});
});
describe('User', ...);
Тем не менее, ошибка, которую вы получаете, может быть от 3 асинхронных крючков, которые не сообщают Mocha для продолжения. Они должны либо вызвать done()
, либо пропустить аргумент, чтобы их можно было рассматривать как синхронные:
describe('User', function(){
beforeEach(function(done){ // arg = asynchronous
done();
});
after(function(done){
done()
});
describe('#save()', function(){
beforeEach(function(){ // no arg = synchronous
});
// ...
});
});
Из документов:
Добавив обратный вызов (обычно называемый done
) на it()
, Mocha будет знать, что он должен ждать завершения.
Ответ 2
Я реализовал это немного иначе.
- Я удалил все документы в "before" hook - нашел это намного быстрее, чем dropDatabase().
-
Я использовал 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();
}
});