坚持使用mongoose express应用程序进行摩卡测试

时间:2013-05-29 08:09:00

标签: unit-testing express mongoose mocha

这是交易,我在/models/foo.js中有这个Foo模型:

var mongoose = require('mongoose'),
    Schema   = mongoose.Schema;

var Foo = new Schema({
  Bar : {type: Boolean, default: false},
  Baz   : String
});

Foo.statics.isBar = function(id, callback) {
  return this.update({'_id': id}, {$set: {Bar: true}}, callback);
};

module.exports = mongoose.model('Foo', Foo);

现在我正在尝试用/test/modelFoo.js中的mocha(带chai expect库)编写测试。

var chai     = require('chai'),
    expect   = chai.expect,
    mongoose = require('mongoose'),
    Foo      = require('../models/foo');

// ...connecting to the db and creating a test Foo...

describe('Foo Bar', function(){
  it('should set Bar to true', function(done){
    Foo.findOne({}, function(err, foo) {
      Foo.isBar(foo._id, function() {
        expect(foo.Bar).to.be.true;
        done();
      });
    });
  });
});

断言失败。看着mongo,Bar仍然是假的。

令我头疼的是我在其他地方有这条路线

app.get('/bar/:id', function(req, res){
  Foo.isBar(req.params.id, function(err) {
    if(err) // handle it
    else res.redirect('back');
  });
});

......很好地将Bar设置为true。

我没有弄到什么问题。这是我的考试吗?我的模特?

1 个答案:

答案 0 :(得分:0)

问题是update不会更新您的模型实例(它会更新数据库,但这就是您的路由正常工作的原因)。

因此,在您检查之前,您将不得不再次从数据库中检索它:

  Foo.isBar(foo._id, function() {
    Foo.findOne(foo._id, function(err, updatedFoo) {
      expect(updatedFoo.Bar).to.be.true;
      done();
    });
  });

另一种方法是使用findByIdAndUpdate() - 它将两个操作(更新和检索)与一个方法调用相结合 - 相反,但这需要重写Foo.statics.isBar