[英]Mongoose mongodb saving sub documents confusion? Mocha test not getting to done()
我正在嘗試在mocha中編寫一些測試,以將文檔和某些子文檔保存在beforeEach
方法內,但是它似乎永遠無法done
,然后超時。
這是模式:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var LatLng = new Schema({
id: Schema.ObjectId,
created_at: Date,
accuracy: {
type: Number,
required: true
},
latitude: {
type: Number,
required: true
},
longitude: {
type: Number,
required: true
}
});
LatLng.pre('save', function(next){
if(!this.created_at)
this.created_at = new Date();
});
var Walk = new Schema({
id: Schema.ObjectId,
created_at: Date,
updated_at: Date,
description: String,
elapsedTime: Number,
distance: Number,
waypoints: [LatLng],
_user: {
type: Schema.ObjectId,
ref: 'User',
required: true
}
});
Walk.pre('save', function(next){
var now = new Date();
this.updated_at = now;
if(!this.created_at)
this.created_at = now;
next();
});
Walk.pre('update', function(next){
this.updated_at = new Date();
});
Walk.pre('findOneAndUpdate', function(next){
this.updated_at = new Date();
});
Walk.pre('findByIdAndUpdate', function(next){
this.updated_at = new Date();
});
module.exports = mongoose.model('Walk', Walk);
這是beforeEach
:
beforeEach(function(done){
var _this = this;
//create temporary user
var userData = { username: 'bob', password: 'password123' };
var user = new User(userData)
.save(function(err, user){
if(err) done(err);
_this.user = user;
//login with temporary user
req.post('/login')
.send(userData)
.end(function(err, res){
if(err) done(err);
//create temporary models
var walk1 = new Walk({
description: 'description1',
elapsedTime: 10000,
distance: 5000,
_user: res.body.user._id,
waypoints: [
{"accuracy":11, "latitude":44.06523257, "longitude":-123.06101363},
{"accuracy":12, "latitude":44.06525829, "longitude":-123.06100709},
{"accuracy":11, "latitude":44.06523424, "longitude":-123.06099261},
{"accuracy":11, "latitude":44.0652201, "longitude":-123.06097669}
]
});
var walk2 = new Walk({
description: 'description1',
elapsedTime: 10000,
distance: 5000,
_user: res.body.user._id,
waypoints: [
{"accuracy":11, "latitude":44.06523424, "longitude":-123.06099261},
{"accuracy":11, "latitude":44.0652201, "longitude":-123.06097669},
{"accuracy":11, "latitude":44.06521917,"longitude":-123.06098176}
]
});
var walk3 = new Walk({
description: 'description1',
elapsedTime: 10000,
distance: 5000,
_user: res.body.user._id,
waypoints: [
{"accuracy":6, "latitude":44.06528592, "longitude":-123.06087405},
{"accuracy":4, "latitude":44.06528038, "longitude":-123.06088851},
{"accuracy":4, "latitude":44.06528185, "longitude":-123.06088036}
]
});
//save temporary models
walk1.save(function(err, walk){
console.log('got here'); // <--Never gets here
if(err) return done(err);
_this.walk1 = walk1;
console.log(walk);
walk2.save(function(err, walk){
if(err) return done(err);
_this.walk2 = walk2;
console.log(walk);
walk3.save(function(err, walk){
if(err) return done(err);
_this.walk3 = walk3;
console.log(walk);
done(); // <---Done is called here, so it's not this...
});
});
});
});
});
});
這是我要編寫的測試:
it.only('should create a new walk', function(done){
var _this = this;
var walk = {
description: "this is a description",
elapsedTime: 100000,
distance: 5000,
waypoints:
[{ "accuracy":11, "latitude":44.06523257, "longitude":-123.06101363 },
{ "accuracy": 12, "latitude": 44.06525829,"longitude": -123.06100709},
{ "accuracy": 21, "latitude":44.06521917, "longitude":-123.06098176 }]
};
var query = { description: walk.description};
req.post('/login')
.send(userData)
.end(function(err, res){
if(err) return done(err);
req.post('/walks')
.send(walk)
.expect(200)
.end(function(err, res){
if(err) return done(err);
res.body.success.should.equal(true);
Walk.findOne(_this.query, function(err, walk){
if(err) return done(err);
walk.should.not.be.null();
walk.description.should.match(_this.walk.description);
walk.elapsedTime.should.equal(_this.walk.elapsedTime);
walk.distance.should.equal(_this.walk.distance);
walk.waypoints.should.be.type('object');
done();
});
});
});
});
對不起格式,它在復制和粘貼時搞砸了。
我對問題是什么感到困惑...當我嘗試運行測試時,我得到的只是它說beforeEach
已經超時並且調用了done
。 但是done
,因此我認為實際上在保存時正在發生某些事情,但是沒有產生錯誤。 我嘗試將Mochas timeout
設置為30秒,以查看是否是mongodb滯后,但無濟於事。 此刻完全感到困惑,希望你們當中一位很棒的人能救我:)
感謝您抽出寶貴的時間閱讀我的文章並提供幫助!
更新 :
所以我把一些console.log()
內的語句Walk.pre('save')
以及在LatLng.pre('save')
看來, Walk.pre('save')
從來沒有得到所謂的,但是LatLng.pre('save')
是...
更新2:
試圖將一些console.log()
語句放入post('save')
函數中,看來它們從未被調用過。 LatLng.pre('save')
被調用,然后我認為它只是掛在那兒...?
哇,不敢相信我錯過了。 只是忘了在我的LatLng.pre('save')
調用next
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.