2012-02-10 9 views
5

誰もがMongoose検証をテストする方法を知っていますか? validateEmail方法は、このようなのように定義される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 } 
}); 

// 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を打つことなく動作していることがわかります。私はこれらのテスト中にMongoを打ちたいとは思わない。 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に新たなんですmongooseですが、これは私のモデル+バリデーターをテストする方法で、これまでのところうまくいきました。

+0

最後のカップルのためにユーザーに電話をかけるテストの数。validate():私はgruntとJasmine Nodeを使用してテストを実行しています。私のアサーションはビルドに失敗することはありませんでした。アサーションを適切に実行させるためにコールバックのテストをセットアップしなければなりませんでした。私のケースでは、jasmine-nodeを使用して、各テストの終わりにjasmine.asyncSpecWait()を追加し、validateコールバック内にjasmine.asyncSpecDone()を追加しました。それからすべてがよかった。非常に有用な答え! –

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; 
    }); 
関連する問題