2017-03-03 9 views
0

私のExpressサーバーのルートをSupertestでテストしたいと思います。そのルートでは、私は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ループ経由で遅延を試みましたが、何もしませんでした。 (Array.forEachを使用しないとよいでしょうか)

文書の間に少なくともMS遅延があることを確認する方法はありますか?

答えて

0

私の問題は、すべてのプロセスの非同期性を考慮しなかったことがわかりました。

私はPromisesのすべてをラップしています。今すぐ動作します。私は再帰的に生成機能を使用しているため、これはES2015の下に働くだろう

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(); 
      } 
     }); 
    }); 

わからない場合:ここに私の新しいコードです。

私がそれを使用すると、モングースは文句を言います。それから私は私のテスト・セットアップ機能の上に次の操作を行います。

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

私はこの1つのテストに多くの時間を無駄にすることの価値があった願っています:D

関連する問題