簡體   English   中英

貓鼬mongodb保存子文件混亂嗎? 摩卡測試未完成()

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM