2012-02-10 4 views
5

몽구스 유효성 검사를 테스트하는 방법을 아는 사람이 있습니까? 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); 
} 

내가 유효성을 검사 할

예, I는 (예로서) 다음 스키마를 갖는다. 최종 결과는 유효성 검사를 테스트 할 수 있기를 원하며 이러한 상황에 따라 이러한 코드 조각 간의 상호 작용을 테스트하는 다른 테스트를 작성할 수 있습니다. 예 : 사용자가 찍은 것과 동일한 사용자 이름으로 가입을 시도합니다 (이미 사용중인 이메일). 나는 실제로 유효성 검사가 DB를 치지 않고 작동 중임을 보거나 검사 할 수있는 테스트가 필요합니다. 이 테스트 중에 몽고를 치고 싶지는 않습니다. 통합 테스트가 아닌 UNIT 테스트 여야합니다. :)

고마워요!

답변

9

나는 최근에 같은 문제가있었습니다.

먼저 필자는 자체적으로 유효성 검사기를 테스트하는 것이 좋습니다. 파일을 별도의 파일로 이동하고 보유하고있는 유효성 검사 기능을 내보내십시오.

다른 유효 모델을 다른 모델에 공유 할 수 있기 때문에 모델을 쉽게 분리 된 파일로 분리 할 수 ​​있습니다. 세게 부 지금

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

: 여기

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

는 샘플이 (사용 모카 + 함)에 대한 시험이다 : 여기

자신의 검증 테스트의 예이다 :)

데이터베이스에 액세스하지 않고 모델이 유효한지 테스트하려면 모델에서 직접 호출 할 수있는 유효성 검사 기능이 있어야합니다. 내가 nodeJS 여전히 새로운 해요

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

:

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

유효성 검사기 콜백과 같은 에러 객체 다시 가져옵니다 여기

내가 현재 그것을 할 방법의 예입니다 mongoose하지만 이것은 내 모델 + 유효성 검사기를 테스트하는 방법이며 지금까지 꽤 잘 작동하는 것 같습니다.

+0

사용자에게 전화하는 테스트validate() : 나는 자스민 노드 (Jasmine Node)를 사용하여 테스트를 수행하고 있는데, 빌드를 실패하면 내 어설트리 (assertions)는 결코 치지 않습니다. 나는 어설 션을 제대로 실행하기 위해 콜백에 대한 테스트를 설정해야했다. 제 경우에는 jasmine-node를 사용하여 jasmine.asyncSpecWait()을 각 테스트의 끝에 추가하고 jasmine.asyncSpecDone()을 validate 콜백 내부에 추가했습니다. 모든 것이 좋았습니다. 매우 유용한 답변! –

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