2012-02-10 131 views
5

有誰知道如何測試Mongoose驗證?測試MongooseJs驗證

實施例,我有以下模式(作爲例子):

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._-][email protected][a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/.test(val); 
} 

我要測試的驗證。最終結果是,我希望能夠測試驗證,並根據這些事情發生,然後我可以編寫其他測試來測試這些代碼片段之間的交互。例如:用戶嘗試使用與使用相同的用戶名註冊(電子郵件已在使用中)。我需要一個測試,我可以實際攔截或看到驗證正在工作而沒有擊中數據庫。在這些測試中,我不想打蒙戈。這些應該是UNIT測試而不是集成測試。 :)

謝謝!

回答

9

我最近有同樣的問題。

首先我會推薦自己測試驗證器。只需將它們移動到單獨的文件並導出您擁有的驗證功能即可。

這很容易讓您的模型被分割成單獨的文件,因爲您可以在不同的模型中共享這些驗證器。

這裏是對自己的測試驗證器的一個示例:

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

下面是該(使用摩卡+應該)的樣品測試:

// 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) 
    })  
}) 

現在對於較硬的部分: )

要在不訪問數據庫的情況下測試模型的有效性,可以在模型上直接調用驗證函數。

這裏是我目前如何做到這一點的例子:

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 = "[email protected]" 
    user.validate(function(err){ 
     assert.equal(err, null) 
    }) 
    }) 
}) 

驗證器回調得到一個錯誤的對象回來,看起來是這樣的:

{ 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和貓鼬,但這是我如何測試我的模型+驗證器,它似乎目前工作得很好。

+0

在過去的幾您呼叫用戶的測試。validate():我正在使用grunt和Jasmine Node運行我的測試,並且我的斷言從未被命中以失敗構建。我必須設置回調的測試才能使斷言正常運行。在我的情況下,使用jasmine-node,我在驗證回調中添加了一個jasmine.asyncSpecWait()到每個測試的結尾和一個jasmine.asyncSpecDone()。然後一切都很好。非常有用的答案! – 2014-03-17 17:30:07

2

您應該使用validate()方法作爲承諾,並使用針對異步內容聲明的工具(例如:Chai as Promised)對其進行測試。

首先,需要一個承諾庫,並轉出的承諾提供商(例如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: '[email protected]' 
     }); 
     return expect(user.validate()).to.be.fulfilled; 
    });