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 はまだ false です。

頭を悩ませているのは、他の場所にこのルートがあることです

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

...そして、バーを適切に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()別の方法として、両方のアクション (更新と取得) を 1 つのメソッド呼び出しと組み合わせて使用​​することもできますが、それにはFoo.statics.isBar.

于 2013-05-29T08:37:28.040 に答える