【问题标题】:Stuck with a mocha test on a mongoose express app卡在猫鼬快递应用上的摩卡咖啡测试
【发布时间】:2013-05-24 09:36:36
【问题描述】:

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

让我头疼的是,我在其他地方也有这条路线

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

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

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

【问题讨论】:

    标签: unit-testing express mongoose mocha.js


    【解决方案1】:

    问题在于update 不会更新您的模型实例(不过,它会更新数据库,这就是您的路线可以正常工作的原因)。

    因此,您将不得不再次从数据库中检索它,然后才能对其进行检查:

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

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

    【讨论】:

    • 这么多谢谢,我快疯了。我使用了替代方法,它使测试更“可读”且嵌套更少。你让我开心!
    • 只是一个愚蠢的问题,为什么 update() 和 findByIdAndUpdate() 的行为方式不同?
    • @jndvdcn 我认为是因为findByIdAndUpdate 涉及的额外工作,这可能会在后台进行更新和检索;如果您只想更新数据库中的文档,但不需要直接更新文档的版本,使用update 会跳过不必要的检索操作。此外,update 可用于更新多个文档,而findByIdAndUpdate 仅针对一个文档。
    猜你喜欢
    • 2015-07-18
    • 2014-07-28
    • 2012-07-06
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 2012-12-03
    • 2015-12-28
    • 2013-12-04
    相关资源
    最近更新 更多