2015-11-20 8 views
7

私は抽象化を必要とするアプリケーションを開発しています。mongooseを使った抽象クラス

具体的なクラスの内部で契約を作成するなどのインターフェースの動作を「シミュレート」したいと思います。

実際には、ユーザーを扱う、私は実装契約にUserMongoRepositoryクラスを持っている:

  • のgetAll()約束
  • getById(ID)により、ユーザーの完全なリストは、ユーザー懸念を返しますなど

...約束

  • して、ユーザーを保存する(ユーザー)の保存約束
  • によって私は同じ私を持っていますUserMysqlRepositoryの内部に実装されています(変更が必要なときに動作を切り替えることができます)。

    問題

    私の問題は、私はより多くのアクティブなレコードのように、DataMapperのように行動していませんマングースを扱ってるということです。

    それは保存(ユーザー)の私の実装は、以下のようなビット奇妙になることを意味します

    save(user){ 
        let mongooseUser = this.convert(user); 
        return user.save(); 
        } 
    

    変換方法は、私は、特定のマングースモデルに標準モデルから切り替えることができます。これにより、私にも、抽象概念を持たせることができ、アプリケーションの全データアクセスを書き直す必要がなくなります。私は私の完全なクラスをテストユニットにしようとしたとき

    私の本当の問題は、次のとおりです。標準的な方法で

    import MongooseUser from '../../auth/mongooseModel/MongooseUser'; 
    /** 
    * UserMongoRepositoryclass 
    */ 
    export default class UserMongoRepository{ 
    
        /** 
        * Create an UserMongoRepository 
        */ 
        constructor(){ 
    
        } 
    
        /** 
        * Convert a User to a MongooseUser 
        */ 
        convert(user){ 
        return new MongooseUser({email:user.mail,password:user.password,firstname:user.firstName, lastname:user.lastName}); 
        } 
    
        findById(id){ 
        return MongooseUser.find({id:id}); 
        } 
    
        save(user){ 
        return user.save(); 
        } 
    
    } 
    

    、私は私のコンストラクタの内部で私のDAOを注入し、それを模擬することができることでしょう。

    mongooseの場合、ジョブを作成する要素はインスタンス化されたオブジェクトではなく(私はそれを嘲笑することができます)、ドキュメントの上部にインポートされたクラス定義なので、やや邪魔です。

    ソリューション

    私は、コンストラクタの内部パラメータとしてMongooseUserクラスの定義を渡すべきか?私は、変換方法の内、このコードを持っているだろうことを示唆している

    let user = new this.MongooseUser({}) 
    

    は、あなたがデータマッパーの方法で抽象マングースの行動に、より良いアイデアを持っていますか?

    私はそれが、私の感覚では、NodeJSで最も先進的な一つだ、別のモジュールを使用したくない...

  • +0

    明確にするために、あなたはマングースの権利を使用している – CreasolDev

    +0

    今のところ、別の方法として、あなただけのMongooseUserクラス(要件あなたがスタブされているファイルへの相対パスオーバーライドすることができます?私はそれを使用している、はい – mfrachet

    +0

    私はatmに行く必要がありますが、私はあなたにすぐに答えを与える;) – CreasolDev

    答えて

    0

    あなたが言うものの、私は、import構文(もEMCASCRIPT-6)に精通していませんよnode.jsを使用しているので、proxquireパッケージを使用することをおすすめします。このパッケージでは、外部パッケージを要求することができ、そのパッケージが使用する要件をスタブすることができます。まだあなたのMongooseUserを使用している間、あなたのパッケージにそれを定義したとして、あなたがあなた自身のmongoose実装を使用できるようになる

    proxyquire('../my/class/that/uses/mongoose', { 
        mongoose: MyTestMongooseImplementation 
    }) 
    

    :だからあなたの場合には、次のような何かを行うことができます。

    proxyquire('/path/to/UserMongooseRepository', { 
        '../../auth/mongooseModel/MongooseUser': MyTestMongooseUser 
    }) 
    

    ドキュメント:https://www.npmjs.com/package/proxyquire