私はノードに従っています。ここ は、パッチのルートMongooseがUNIXのタイムスタンプを変更して、UTC時刻に変換しています
app.patch('/todos/:id', (req, res) => {
var id = req.params.id;
var body = _.pick(req.body, ['text', 'completed']);
if (!ObjectID.isValid(id)) {
return res.status(404).send();
}
if (_.isBoolean(body.completed) && body.completed) {
body.completedAt = new Date().getTime();
} else {
body.completed = false;
body.completedAt = null;
}
Todo.findByIdAndUpdate(id, {$set: body}, {new: true}).then((todo) => {
if (!todo) {
return res.status(404).send();
}
res.send({todo});
}).catch((e) => {
res.status(400).send();
})
});
そして、ここで同じルートのためのテストスイートです:
it('should update the todo', (done) => {
var hexId = dummy[0]._id.toHexString();
var text = 'This should be the new text';
request(app)
.patch(`/todos/${hexId}`)
.send({
completed: true,
text
})
.expect(200)
.expect((res) => {
expect(res.body.todo.text).toBe(text);
expect(res.body.todo.completed).toBe(true);
expect(res.body.todo.completedAt).toBeA('number');
})
.end(done);
});
テスト結果:
エラー:「2017-07-12T18:38:11.814Z 'number'にする
古くなったUNIXのタイムスタンプではなく、サーバ からUTCの日付を受け取るため、最後のテストケースが失敗します。しかし、それは新しいDate()。getTime()?の結果であるため、タイムスタンプではないでしょうか。
私は、ルートからbody.completedAt()とtodo.completedAt()の両方をログに記録しようとしました。
body.completedAt()はunixタイムスタンプ を返しますが、todo.completedAt()はUTC時刻を返します。だから、マングースがタイムスタンプを変更しているようです。しかし、どうすれば最後のテストケースが合格になるのを防ぐことができますか?
私はMongoDBのスキーマをチェックしないように十分愚かだった、まあ期待アサーションライブラリに