在构造函数中插入变量?
Stubbing variables in a constructor?
我正在尝试弄清楚如何正确地存根这个场景,但我有点卡住了。
场景是,我有一个 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
的测试,我更感兴趣的是如何模拟相关数据。
在我看来,您需要存根整个 "db" 模块。这样你就没有任何真正的数据库连接,你可以轻松地控制你的测试环境。您可以使用 mockery 模块实现此目的。
这样你就可以存根 require('../../db')
returns 的对象。这将允许您在该对象的属性中设置您喜欢的任何值。
在 Scotty 对已接受答案的评论的基础上稍微……这是我得到的一些代码,似乎可以完成这项工作。不能保证这是一个好的实现,但它确实成功地删除了 insert
和 get
方法。希望它可以帮助某人。 :)
// /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(); }
};
}
});
我正在尝试弄清楚如何正确地存根这个场景,但我有点卡住了。
场景是,我有一个 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
的测试,我更感兴趣的是如何模拟相关数据。
在我看来,您需要存根整个 "db" 模块。这样你就没有任何真正的数据库连接,你可以轻松地控制你的测试环境。您可以使用 mockery 模块实现此目的。
这样你就可以存根 require('../../db')
returns 的对象。这将允许您在该对象的属性中设置您喜欢的任何值。
在 Scotty 对已接受答案的评论的基础上稍微……这是我得到的一些代码,似乎可以完成这项工作。不能保证这是一个好的实现,但它确实成功地删除了 insert
和 get
方法。希望它可以帮助某人。 :)
// /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(); }
};
}
});