7

Mongoose Validations をテストする方法を知っている人はいますか?

例として、次のスキーマがあります (例として):

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

検証をテストしたい。最終的な結果は、検証をテストできるようになりたいということです。これらの発生に応じて、それらのコード間の相互作用をテストする他のテストを作成できます。例: ユーザーが取得したものと同じユーザー名でサインアップしようとします (電子メールは既に使用されています)。DBにアクセスせずに検証が機能していることを実際にインターセプトまたは確認できるテストが必要です。これらのテスト中に Mongo を攻撃したくありません。これらは、統合テストではなく、UNIT テストである必要があります。:)

ありがとう!

4

2 に答える 2

11

私は最近同じ問題を抱えていました。

まず、バリデーターを単独でテストすることをお勧めします。それらを別のファイルに移動して、持っている検証関数をエクスポートするだけです。

これにより、これらのバリデーターを異なるモデル間で共有できるため、モデルを個別のファイルに簡単に分割できます。

バリデータを単独でテストする例を次に示します。

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

これに対するサンプル テストを次に示します (mocha+should を使用)。

// 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 = "test123@email.com"
    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に慣れていませんが、これが私のモデルとバリデーターをテストする方法であり、これまでのところうまくいっているようです.

于 2012-02-15T06:15:18.167 に答える
2

validate() メソッドをプロミスとして使用し、非同期のものをアサートするツールでテストする必要があります (例: Chai as Promised )。

まず、Promise ライブラリを要求し、Promise プロバイダー (Q など) に切り替えます。

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

その後、promise について assert を使用します。

    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;
    });
于 2015-08-29T06:55:20.837 に答える