3
我的猫鼬模型包含一个只有在另一个字段等于特定值(即有条件)时才需要的字段。猫鼬自定义验证在控制器中不起作用
在本例中,我有一个项具有 '的typeA' 或 '的TypeB' 的ITEMTYPE。字段someField只对'typeB'是必需的。
在我的测试中,验证似乎工作时直接测试模型。但是,验证不在控制器中触发。
我的模型如下:
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var ItemSchema = new Schema({
name: {
type: String,
trim: true,
required: true
},
itemType: {
type: String,
enum: ['typeA', 'typeB'],
required: true
},
someField: String
});
ItemSchema
.path('someField')
.validate(function(value, respond) {
if (this.itemType === 'typeA') { return respond(true); }
return respond(validatePresenceOf(value));
}, 'someField cannot be blank for typeB');
function validatePresenceOf(value) {
return value && value.length;
}
module.exports = mongoose.model('Item', ItemSchema);
在该模型我的单元测试:
it('should fail when saving typeB without someField', function(done) {
var item = new Item({
name: 'test',
itemType: 'typeB'
});
item.save(function(err){
should.exist(err);
done();
});
});
以上的单元测试工作没有问题。但是,在测试API本身时,Mongoose不会引发错误。该控制器应该返回500错误,如果它不能保存:
exports.create = function(req, res) {
var item = new Item(req.body);
item.save(function(err, data) {
if (err) { return res.json(500, err); }
return res.json(200, data);
});
};
但是,下面的测试总是返回200:
var request = require('supertest');
describe('with invalid fields', function() {
it('should respond with a 500 error', function(done) {
request(app)
.post('/api/item')
.send({
name: 'test',
itemType: 'typeB'
})
.expect(500)
.end(function(err, res) {
if (err) return done(err);
return done();
});
});
});
});
我不知道我在做什么错了,当我保存在控制器中时,似乎Mongoose验证没有被触发。
谢谢尼尔,使完美感:) – mousetree 2014-09-05 09:54:54