2014-09-04 69 views
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验证没有被触发。

回答

3

这里的实现是错误的。您不在'someField'上进行验证,而是在传递给'itemType'的值上进行验证。之所以这样,是因为你没有为'someField'提供任何值,所以验证者从来没有被调用,因为没有任何定义。

所以测试运行的其他方式,也可以矫正你的validatePresenceOf()功能:

itemSchema.path('itemType').validate(function(value) { 
    if (value === 'typeA') 
    return true; 
    console.log(validatePresenceOf(this.someField)); 
    return validatePresenceOf(this.someField); 

}, 'someField cannot be blank for itemType: "typeB"'); 

function validatePresenceOf(value) { 
    if (value != undefined) 
    return value && value.length 
    else 
    return false; 
} 

这将抛出一个错误,正确的是“项目类型”设置为“类型B”和“someField”有没有任何价值。

+0

谢谢尼尔,使完美感:) – mousetree 2014-09-05 09:54:54