2016-03-19 3 views
0

私はこのシナリオを適切にスタブする方法を理解しようとしていますが、ちょっと立ち往生しています。コンストラクタの変数をスタブしますか?

このシナリオでは、db.jsファイルにcouchdbデータベースのリスト(各データベースには特定の年のツイートエントリが含まれています)があります。

毎年新しいデータベースが作成され、その年の新しいエントリを保持するためにこのリストに追加されます(データベースのリストは一定ではなく、毎年変わります)。

だから私のdb.jsファイルは次のようになります。このようなメソッドが追加される前に、

var nano = require('nano')(`http://${host}`); 

var databaseList = { 
    db1: nano.use('db2012'), 
    db2: nano.use('db2013'), 
    db4: nano.use('db2014'), 
    db5: nano.use('db2015'), 
    db6: nano.use('db2016') 
}; 

module.exports.connection = nano; 
module.exports.databaseList = databaseList; 

event.js(シンプルなモデルファイル)ルックス:

var lastInObject = require('../../helpers/last_in_object'); 

var db = require('../../db'); 

var EventModel = function EventModel() { 
    this.connection = db.connection; 
    this.databaseList = db.databaseList; 
    this.defaultDatabase = lastInObject(db.databaseList); 
}; 

EventModel.prototype.findAll = 
function findAll(db, callback) {/* ... */} 

私の質問は、私が行う方法であり、スタブdatabaseList、私は安全に成長するdatabaseListオブジェクトからの脆弱性を持つことなく、それぞれのモデルメソッドをテストできますか?

理想的には、さまざまなシナリオを模擬するために、私のテストでdatabaseListの内容をハイジャックすることができますが、私はそれに対処する方法がわかりません。

ここdefaultDatabaseプロパティは常に最後の既知のイベントを指していることを確認するために、テストだが、ときdatabaseList変更それがテストを行って、明らかに私は、毎年このテストを更新する必要がありますする必要はありません非常に脆い。

it('should set the default database to the last known event',() => { 
    var Event = require('../event'); 
    var newEventModel = new Event(); 

    expect(newEventModel.defaultDatabase.config.db) 
     .to.equal('db2014'); 
}); 

歓迎!もし私がこの間違ったことをしてしまったら、私が何をしたのか、どうやってそれにアプローチできるのか教えてください!

また、これはちょうどシナリオです。私はlastInObjectのテストをしています。私は関連するデータを模擬する方法にもっと興味があります。

答えて

1

私の意見では、 "db"モジュール全体をスタブする必要があります。そうすれば、実際のDB接続がなくなり、テスト環境を簡単に制御できます。これは、mockeryモジュールを使用して実現できます。

こうすれば、require('../../db')が返すオブジェクトをスタブすることができます。これにより、そのオブジェクトのプロパティで好きな値を設定することができます。

+0

非常に良い叫び声!私は実際にうまく動作するように苦労しましたが、周りを検索した後、プロキシクワイアは嘲笑と非常によく似ています。ありがとう@ jahnestacado! :) – Scotty

0

受け入れられた答えのScottyのコメントに基づいてビルドしてください。ここに私が仕事をしていると思われるコードがあります。これが良い実装であることは保証されていませんが、insertgetメソッドを正しくスタブしています。うまくいけば、誰かを助けてくれるだろ:)

// /src/common/database.js 
const database = require('nano')('http://127.0.0.1/database'); 

module.exports = { 

    async write(document, documentId) { 
    return await new Promise(resolve => database.insert(document, documentId, resolve)); 
    }, 

    async read(documentId){ 
    return await new Promise(resolve => database.get(documentId, resolve)); 
    } 

}; 

// /test/setup.js 
const proxyquire = require('proxyquire'); 

proxyquire('../src/common/database.js', { 
    nano() { 
    return { 
     insert(document, documentId, callback){ callback(); }, 
     get(documentId, callback){ callback(); } 
    }; 
    } 
});