2016-03-19 217 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」模塊。這樣你就不會有任何真正的數據庫連接,你可以很容易地控制你的測試環境。您可以通過使用mockery模塊來實現此目的。

這樣你可以存根require('../../db')返回的對象。這將允許您在該對象的屬性中設置任何您喜歡的值。

+0

非常好的留言!我真的很努力去嘲弄工作,但經過四處搜尋,似乎proxyquire與嘲笑非常相似,現在我已經完成了我的測試工作!謝謝@jahnestacado! :) – Scotty

0

建立在斯科蒂的評論接受的答案有點......這裏有一些代碼,我得到了似乎做的工作。沒有保證這是一個很好的實現,但它確實成功地將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(); } 
    }; 
    } 
});