2011-08-25 81 views
0

使用Vows/Coffeescript/Mongoose並運行到數據庫的異步問題。使用Vows和Mongoose異步測試

在測試運行之前,我做了一堆設置,包括清除測試數據庫。一旦我在最後一個文檔中調用remove,我就會撤消回調,因此Vows可以繼續進行下一步測試。麻煩的是,不能保證數據庫實際上將被清除,因爲事情發生異步。在這種情況下,我實際上想同步,但我不知道如何做到這一點。

下面的代碼(誓言片斷,然後清洗功能DEF):

'AND the test database is empty': 
    topic: -> 
    testDB.purge "widgets_test", @callback 

purge = (database, callback) -> 
db = mongoose.connect "mongodb://localhost/#{database}" 
modelCount = Models.length 
for model in Models 
    modelCount-- 
    model.find {}, (err, docs) -> 
     docCount = docs.length 
     for doc in docs 
      doc.remove (err) -> 
      docCount-- 
    # do callback after all data has been purged - setTimeout HACKHACKHACK 
     if modelCount is 0 and docCount is 0 
      setTimeout -> 
       callback() 
      , 100 

什麼是做到這一點的正確方法?

回答

2

我使用的技巧是在分開的批處理中執行此設置/拆卸,然後在後續批處理中運行測試。

這似乎爲我工作(我使用也誓言和蒙戈)

+0

是啊,這不是一個壞的解決方案,以確定事情順序運行。但是在上面的例子中,如果沒有setTimeout,你可能已經在數據庫清除之前進入了你的測試。假設你在刪除最後一個模型的最後一個文檔之後,猜測你可以重新編寫fireoff callback()作爲doc.remove回調的一部分。但它仍然很醜陋。 –

+0

您需要觸發回調以確保批次已執行並結束。這是醜陋的,但一些異步工作的問題。 – theprogrammer