在没有命中数据库的情况下测试Hapijs端点

时间:2014-09-06 22:54:13

标签: node.js integration-testing hapijs

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


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

身份验证请求将命中routes.js并转发给authHandler.js,后者又调用userDb.js。 userDb.js与数据库通信并将结果返回给authHandler.js,后者将响应返回给客户端。

我一直在尝试编写一个userDb.js不与数据库对话的测试

为此,我使用Hapi的注入能够在不实际启动服务器的情况下调用路由。我正在努力弄清楚如何模拟调用链中的数据库,以便我可以提供虚拟响应。

因此,简而言之,我希望在测试时将userDb.js替换为mock。

1 个答案:

答案 0 :(得分:2)

在上述@AlbertZaccagni的建议之后,我咨询了documentation的sinon,我想出了以下内容:

注意:我已经省略了一些代码来声明手头问题的路线和其他非必要部分。

假设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.*/
    });
}

在我的测试文件夹中,我创建了一个名为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();
        });
    });
});

当我在我的工作目录上运行npm test时,我看到它在没有实际调用数据库的情况下通过,并且为用户名1返回100。