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

Man*_*iya 12 node.js sequelize.js node-mysql hapijs

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

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

Sli*_*ban 5

你应该能够使用像sinon这样的东西嘲笑你require.例如,假设你有一个dbHandler.js:

var db = require('db');

module.exports.handleOne = function(request, reply) {
    reply(db.findOne());
}
Run Code Online (Sandbox Code Playgroud)

然后在你的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
});
Run Code Online (Sandbox Code Playgroud)

您仍然可以模拟该调用,因为所有调用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');
});
Run Code Online (Sandbox Code Playgroud)

  • @MananVaghasiya见http://nodejs.org/api/globals.html#globals_require_cache.一旦解决,`require`将缓存对象,随后对模块的`require`调用将返回所述模块的缓存实例. (2认同)