2017-07-12 1 views
0

私はノードに従っています。ここ は、パッチのルート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のスキーマをチェックしないように十分愚かだった、まあ期待アサーションライブラリに

答えて

0

を使用しています: テストケースは失敗していたcompletedAtの種類は日に completedAt: { type: Date, default: null }

を設定したので、それがなければなりませんbe: completedAt: { type: Number, default: null }

関連する問題