0

这是交易,我在 /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。

我不明白出了什么问题。是我的测试吗?我的模型?

4

1 回答 1

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.

于 2013-05-29T08:37:28.040 回答