2017-08-03 8 views
0

テストの目的で、私のMongoDbオブジェクトのcreatedAtフィールドを制御したいと思います。残念ながら、これは標準timestampの実装では不可能であると思います。ここで私はいくつかのオブジェクトを作成するために使用した後、自分の作成したタイムスタンプを設定していたコードの要点だ:createdAtフィールドをmongooseで操作する

const docArray = []; 
const times = [15, 32, 1233, 122].map(seconds => moment().add(seconds, 'seconds')); 

for (let i = 0; i < times.length; i += 1) { 
    // Create an object 
    docArray.push(await createObj(`${i}`)); 

    const doc2update = await MyModel.findById(docArray[i]._id); 
    // Save the original created date 
    const org = doc2update.createdAt; 

    // Do the update 
    doc2update.createdAt = times[i]; 
    doc2update.save(); // tried doc2update.update() without change 

    // Retrieve the updated object 
    docArray[i] = await TaskModel.findById(docArray[i]._id); 

    // Check if change preserved 
    console.log(docArray[i].createdAt - org, 
       'vs expected', 
       doc2update.createdAt - org); 
} 

出力は、私がこのようにして作成された操作と推測

0 'vs expected' 14841 
0 'vs expected' 31809 
0 'vs expected' 1232787 
0 'vs expected' 121762 

かなりがっかりです通常の使用には推奨されませんが、テスト時には便利です。これを回避する方法はありますか?

+0

あなたは何をしようとしていますか教えてください。 – nadavvadan

+0

@nadavvadan:私は作成されたオブジェクト(実際にサブ文書)の中間の時間を計算したいですが、私はcreatedAtタイムスタンプを制御したいと思います。私はちょうど遅れてオブジェクトを追加することができますが、それは(1)不必要なテスト時間を追加することです(2)私はまだ正確な時間を制御しないと同じ精度が不足している –

答えて

0

manipulate timestamp in mongooseは、ドキュメント内の他の値と同様です。

.save()が非同期機能であり、テストが終了するまで待つ必要があるため、テストに失敗します。

await doc2update.save(); 
+0

ありがとう!コーディングの欲求不満... updatedAtを設定することをテストしましたが、あなたがリンクしているコードスニペットによって期待通りに新しいタイムスタンプで上書きされます。 –

関連する問題