这是交易,我在/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。
我没有弄到什么问题。这是我的考试吗?我的模特?
答案 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
。