testingMongooseJsvalidation

有谁知道如何testingmongoosevalidation?

例如,我有下面的Schema(作为例子):

var UserAccount = new Schema({ user_name : { type: String, required: true, lowercase: true, trim: true, index: { unique: true }, validate: [ validateEmail, "Email is not a valid email."] }, password : { type: String, required: true }, date_created : { type: Date, required: true, default: Date.now } }); 

validateEmail方法定义如下:

 // Email Validator function validateEmail (val) { return /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/.test(val); } 

我想testingvalidation。 最终的结果是,我希望能够testingvalidation,并根据这些事情发生,然后我可以写其他testing,testing这些代码片段之间的交互。 示例:用户尝试使用与使用相同的用户名注册(电子邮件已在使用中)。 我需要一个testing,我可以实际拦截或看到validation工作没有打数据库。 在这些testing中,我不想打蒙戈。 这些应该是UNITtesting不是集成testing。 🙂

谢谢!

我最近有同样的问题。

首先,我会推荐自己testingvalidation器。 只要将它们移动到一个单独的文件并导出您有的validationfunction。

这很容易让你的模型被分割成单独的文件,因为你可以在不同的模型上共享这些validation器。

这里是一个自己testingvalidation器的例子:

 // validators.js exports.validatePresenceOf = function(value){ ... } exports.validateEmail = function(value){ ... } 

这是一个示例testing(使用摩卡+应该):

 // validators.tests.js var validator = require('./validators') // Example test describe("validateEmail", function(){ it("should return false when invalid email", function(){ validator.validateEmail("asdsa").should.equal(false) }) }) 

现在的更难的部分:)

为了testing你的模型在没有访问数据库的情况下是有效的,有一个validation函数可以直接在模型上调用。

这里是我目前如何做的一个例子:

 describe("validating user", function(){ it("should have errors when email is invalid", function(){ var user = new User(); user.email = "bad email!!" user.validate(function(err){ err.errors.email.type.should.equal("Email is invalid") }) }) it("should have no errors when email is valid", function(){ var user = new User(); user.email = "test123@email.com" user.validate(function(err){ assert.equal(err, null) }) }) }) 

validation器callback获取一个错误对象,如下所示:

 { message: 'Validation failed', name: 'ValidationError', errors: { email: { message: 'Validator "Email is invalid" failed for path email', name: 'ValidatorError', path: 'email', type: 'Email is invalid' } } } 

我仍然是新的nodeJS和mongoose,但这是我如何testing我的模型+validation程序,它似乎到目前为止工作得很好。

您应该使用validate()方法作为承诺,并使用一个使asynchronous内容(例如: Chai as Promised )生效的工具来testing它。

首先,需要一个承诺库并交换给承诺提供者(例如Q):

 mongoose.Promise = require('q').Promise; 

之后,使用有关承诺的断言:

  it('should show errors on wrong email', function() { user = new UserModel({ email: 'wrong email adress' }); return expect(user.validate()).to.be.rejected; }); it('should not show errors on valid email adress', function() { user = new UserModel({ email: 'test@test.io' }); return expect(user.validate()).to.be.fulfilled; });