testingHapijs端点而不碰到数据库

我正在使用Hapi js开发restApi。 该项目的结构如下:

|-Root server.js |-router routes.js |-handlers authHandler.js |-db userDb.js 

一个authentication请求将命中routes.js并转发给authHandler.js,然后调用userDb.js。 userDb.js与数据库进行通信并将结果返回给authHandler.js,该响应将响应返回给客户端。

我一直在试图写一个testing,其中userDb.js不会与数据库交谈

为此,我使用Hapi的inject来调用路由,而不需要真正启动服务器。 我正在努力弄清楚如何模拟调用链中的数据库,以便我可以提供一个虚拟的响应。

所以简而言之,我想在testing时将userDb.jsreplace为模拟。

       

网上收集的解决方案 "testingHapijs端点而不碰到数据库"

在上面@AlbertZaccagni的build议之后,我咨询了sinon的文档 ,并且提出了以下内容:

注意:我已经省略了一些代码来说明path和其他非关键部分。

假设userDb.js是连接到数据库的模块,并且我想模拟来自数据库的响应:

userDb.js看起来像这样:

 var db = require(/*path to db */); module.exports.getUser = function(id, callback){ db.query('sql query', function(err, rows){ if(err){ return callback(err); } return callback(null, rows[0]);/*returns the first object- in the resultset from the database.*/ }); } 

在我的testing文件夹里面,我创build了一个名为mytest.js的文件,内容如下:

 //don't forget to install sinon JS via npm var sinon = require('sinon'); var server = require(/*path to hapi server*/); var userDb = require(/*path to the module we are stubbing/mocking*/); describe('Stub test', function(){ var options = {}; options.method = 'GET'; options.url = '/user/1'; it('with stubbing', function(done) { var stub = sinon.stub(userDb, 'getUser', function(id, callback) { if (id < 5) { return callback(null, 100);/*in this case i'm just testing to see if this function will get called instead- of the actual function. That's why 100.*/ } return new Error('test error'); }); server.inject(options, function(res) { var result = res.result; res.statusCode.should.equal(200); result.num.should.equal(100); done(); }); }); }); 

当我在我的工作目录上运行npmtesting时,我发现它在没有真正调用数据库的情况下通过,它返回100为用户名1。