2016-02-14 36 views
1

每當我運行我的Mocha測試時,它都會在創建索引和不創建它之間交替。我認爲它不會創建索引,因爲測試可能在完成之前就已經運行了,但是因爲它交替出現了這樣的模式,我不認爲是這種情況。我也認爲這可能與我在每次測試開始時丟棄數據庫有關,但這不應該以某種方式影響每一個測試。Mongoose索引在Mocha測試中沒有創建一半時間

所關注的索引:

submissionSchema.index({ studentID: 1, assignmentID: 1 }, { unique: true }); 

的代碼刪除數據庫:

before(function(done){ 
    mongoose.createConnection(require(__dirname + '/../app/config').mongoURL, function(err){ 
     if (err) throw err; 
     mongoose.connection.db.dropDatabase(function(err){ 
      if (err) throw err; 
      done(); 
     }); 
    }); 
}); 

任何想法是什麼引起的?

+0

mongoose使用不同的'.ensureIndex()'(是仍然是調用)方法爲數據庫連接上定義的索引創建索引。在連接之後,你明確地調用底層驅動程序方法的'.dropDatabase()'。總之,當你吹走數據庫時你還會期望什麼?如果您期望「索引」保持原位,那麼請在相關集合/模型上調用'.remove()'。這不會「刪除」索引或集合(或實際上是數據庫),而只是在插入新數據之前使內容無效。 –

+0

爲什麼每隔一段時間都會工作?如果在創建索引後刪除索引,索引不應該出現嗎? – user36322

+0

他們可能不會。你可以在你調用'.dropDatabase()'的時候顯示一個可重現的情況,並且之後還有索引可用嗎?無論如何,我相信這是「鍋運氣」,特別是如果索引創建被要求以「後臺」模式運行。如果你想要一個堅實的行爲,那麼你最好自己編寫索引創建階段的腳本。貓鼬索引創建的「默認行爲」實際上被認爲是「開發便利性」,並且還建議在生產環境中關閉該選項。 –

回答

1

Blake Sevens是對的。爲了解決這個問題,我在刪除數據庫後重建了索引。

before(function(done){ 
    mongoose.createConnection(require(__dirname + '/../app/config').mongoURL, function(err){ 
     if (err) throw err; 
     mongoose.connection.db.dropDatabase(function(err){ 
      if (err) throw err; 

      var rebuildIndexes = [] 

      var models = Object.keys(mongoose.connections[0].base.modelSchemas); 

      models.forEach(function(model){ 
       rebuildIndexes.push(function(cb){ 
        mongoose.model(model, mongoose.connections[0].base.modelSchemas[model]).ensureIndexes(function(err){ 
         return cb(err); 
        }) 
       }); 
      }); 

      async.parallel(rebuildIndexes, function(err) { 
       if (err) throw err; 
       console.log('Dumped database and restored indexes'); 
       done(); 
      }); 
     }); 
    }); 
}); 
相關問題