Mod*_*ika 8 javascript node.js sinon
我无法理解如何使用sinon模拟我正在测试的模块所需的postgres调用,或者甚至可能.
我不是试图测试postgres模块本身,只是我的对象以确保它按预期工作,并且它正在调用它应该在此实例中调用的内容.
我想问题是需要设置节点,因为我的模块需要postgres模块来命中数据库,但在这里我不想运行集成测试我只是想确保我的代码是孤立的,并没有真正关心数据库正在做什么,我将把它留给我的集成测试.
我看到有些人设置他们的函数有一个可选参数来发送mock/stub/fake到函数,测试它的存在,如果它在那里使用它在所需的模块上,但这对我来说似乎是一种气味(我是节点的新人,所以可能不是这样).
我宁愿嘲笑这个,而不是试图劫持要求,如果可能的话.
一些代码(请注意这不是真正的代码,因为我正在运行TDD并且函数没有做任何事情,函数名称是真的)
测试设置
describe('#execute', function () {
it('should return data rows when executing a select', function(){
//Not sure what to do here
});
});
Run Code Online (Sandbox Code Playgroud)
样本功能
PostgresqlProvider.prototype.execute = function (query, cb) {
var self = this;
if (self.connection === "")
cb(new Error('Connection can not be empty, set Connection using Init function'));
if (query === null)
cb(new Error('Invalid Query Object - Query Object is Null'))
if (!query.buildCommand)
cb(new Error("Invalid Query Object"));
//Valid connection and query
};
Run Code Online (Sandbox Code Playgroud)
像这样环绕postgres模块可能看起来有点滑稽,但是有一些设计,因为这个应用程序将有几个"提供者",我想为它们公开相同的API,所以我可以互换使用它们.
UPDATE
我决定我的测试太复杂了,因为我正在查看是否已经进行了连接调用然后返回了数据,这些数据闻到了我,所以我将其剥离并将其分为两个测试:
模拟测试
it('should call pg.connect when a valid Query object is parsed', function(){
var mockPg = sinon.mock(pg);
mockPg.expects('connect').once;
Provider.init('ConnectionString');
Provider.execute(stubQueryWithBuildFunc, null, mockPg);
mockPg.verify();
});
Run Code Online (Sandbox Code Playgroud)
这工作(我认为)没有postgres连接器代码它失败,它通过(Boom :))
问题现在是使用第二种方法,我将使用一个存根(可能是一个间谍),当它应该失败时传递100%,所以我会在早上选择它.
更新2
我对测试并不是百分之百满意,主要是因为我没有劫持client.query方法,它是一个命中数据库的方法,而只是我的执行方法并强制它沿着路径,但它允许我看到结果并断言它以测试行为,但会对任何建议的改进持开放态度.
我正在使用间谍来捕获方法并返回null和一个包含行的虚假对象,就像方法会传回来一样,这个测试会随着我添加更多Query行为而改变,但它让我超越了我的障碍.
it('should return data rows when a valid Query object is parsed', function(){
var fauxRows = [
{'id': 1000, 'name':'Some Company A'},
{'id': 1001, 'name':'Some Company B'}
];
var stubPg = sinon.stub(Provider, 'execute').callsArgWith(1, null, fauxRows);
Provider.init('ConnectionString');
Provider.execute(stubQueryWithBuildFunc, function(err, rows){
rows.should.have.length(2);
}, stubPg);
stubPg.called.should.equal.true;
stubPg.restore();
});
Run Code Online (Sandbox Code Playgroud)
使用 pg-pool:https://www.npmjs.com/package/pg-pool
无论如何,它都会被添加到 pg 中,并且据称使(嘲笑)单元测试变得更容易......来自 BrianC(https://github.com/brianc/node-postgres/issues/1056#issuecomment-227325045):
查看https://github.com/brianc/node-pg-pool - 它将很快成为 node-postgres 中的池实现,并且不依赖于单例,这使得模拟更加容易。希望这有帮助!
| 归档时间: |
|
| 查看次数: |
5717 次 |
| 最近记录: |