如何使用Server.inject注入模拟测试hapi

时间:2014-08-14 14:29:04

标签: node.js node-mysql sequelize.js hapijs

我想用实验室测试hapi路由,我正在使用mysql数据库。

使用Server.inject测试路由的问题是我无法模拟数据库因为我没有调用包含处理函数的文件,所以如何在处理程序中注入模拟数据库?

1 个答案:

答案 0 :(得分:5)

您应该可以使用类似sinon的内容来模拟require的任何内容。例如,让我们说你在某处有一个dbHandler.js:

var db = require('db');

module.exports.handleOne = function(request, reply) {
    reply(db.findOne());
}

然后在你的server.js:

var Hapi = require('hapi'),
    dbHandler = require('dbHandler')

var server = new Hapi.Server(); server.connection({ port: 3000 });

server.route({
    method: 'GET',
    path: '/',
    handler: dbHandler.handleOne
});

您仍然可以模拟该呼叫,因为所有对require的呼叫都会被缓存。所以,在你的test.js中:

var sinon = require('sinon'),
    server = require('server'),
    db = require('db');

sinon.stub(db, 'findOne').returns({ one: 'fakeOne' });
// now the real findOne won't be called until you call db.findOne.restore()
server.inject({ url: '/' }, function (res) {
    expect(res.one).to.equal('fakeOne');
});