javascript – 使用Node.js中的Sinon.js模拟Postgres进行单元测试

我无法理解如何使用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
});
});

样本功能

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
};

像这样包装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();
    });

这工作(我认为)没有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,fauxRows);

       Provider.init('ConnectionString');
       Provider.execute(stubQueryWithBuildFunc,function(err,rows){
           rows.should.have.length(2);
       },stubPg);

       stubPg.called.should.equal.true;
       stubPg.restore();
    });

解决方法

使用pg-pool: https://www.npmjs.com/package/pg-pool

无论如何它都将被添加到pg中,并据称使得(模拟)单元测试变得更容易……来自BrianC(https://github.com/brianc/node-postgres/issues/1056#issuecomment-227325045):

Checkout 07002 – it’s going to be the pool implementation in node-postgres very soon and doesn’t rely on singletons which makes mocking much easier. Hopefully that helps!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


kindeditor4.x代码高亮功能默认使用的是prettify插件,prettify是Google提供的一款源代码语法高亮着色器,它提供一种简单的形式来着色HTML页面上的程序代码,实现方式如下: 首先在编辑器里面插入javascript代码: 确定后会在编辑器插入这样的代码: <pre
这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代码高亮,因为SyntaxHighlighter的应用非常广泛,所以将kindeditor默认的prettify替换为SyntaxHighlighter代码高亮插件 上一篇“让kindeditor显示高亮代码”中已经
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)
原生JS实现别踩白块小游戏(一)