2017-03-03 92 views
0

我想在的Express服務器上測試路由。在該路線上,我將獲得來自MongoDB的數據列表,並且該數據是,其按updatedAt字段排序。使用相同的更新時間戳排序MongoDB文檔?

我想測試輸出中的順序是否正確,但我有一個問題 - 看起來mongoDb太快了,以至於一些文檔有相同的時間戳(沒想到這是可能的) 。

enter image description here

這是如何內部排序?它似乎不是按_id排序的。以下是我測試中生成文檔的功能:

let first; 
let last; 
Array.from(Array(14)).forEach((e, i) => { 
    const immo = new Immo({ user: this.user.model }); 
    immo.save(); 
    if (i === 2) { 
    // last means last with limit 12 sorted by timestamps descending 
    last = immo._id.toString(); 
    } 
    if (i === 13) { 
    // the last that was put in will be the first in the sorted list 
    first = immo._id.toString(); 
    } 
}); 

輸出是用戶編輯的最後12個項目。我保存了第一個和最後一個,所以我可以在測試中稍後聲明它們。

但測試失敗,因爲有3或4具有相同的時間戳,而實際上是最後一個我按照如何把它放在數據庫中的順序不是真正的最後時間Mongo按時間戳排序(或第一個按降序排列)。

我試圖通過輸入循環中的for-loop做一個延遲,但是什麼也沒做。 (我應該可能不使用Array.forEach?)

有什麼辦法可以確保文檔之間至少有幾個MS延遲?

回答

0

原來我的問題是我沒有考慮所有進程的異步性質。

我將所有內容都包裹在Promise中,現在它可以工作。這是我的新代碼:

如果
it('should return a list of the last 12 objects if a user has 14 objects', function (done) { 
    let first; 
    let last; 
    let i = 0; 
    const model = this.user.model; 
    (function recur() { 
     i += 1; 
     return new Immo({ user: model }) 
     .save() 
     .then((result) => { 
      if (i === 3) { 
      last = result._id.toString(); 
      } else if (i === 14) { 
      first = result._id.toString(); 
      } 
      if (i >= 14) { 
      return result; 
      } 
      return recur(); 
     }); 
    }()) 
    .then(() => { 
     this.request(this.app) 
     .get(url) 
     .set('Authorization', this.authHeader) 
     .expect(200) 
     .end((err, res) => { 
      if (err) { 
      done.fail(err.message); 
      } else { 
      expect(res.body.count).toBe(14); 
      expect(res.body.objects.length).toBe(12); 
      expect(res.body.objects[0]._id).toEqual(first); 
      expect(res.body.objects[11]._id).toEqual(last); 
      done(); 
      } 
     }); 
    }); 

不知道這會工作如下ES2015,因爲我用的是生成函數遞歸。

當我使用它自己的承諾時,貓鼬會抱怨。然後,我做這在我的測試設定功能的頂部:

const mongoose = require('mongoose'); 
mongoose.Promise = require('q').Promise; 

我希望這是值得浪費這麼多時間在這一個測試:d