как внедрить фиктивное тестирование hapi с помощью Server.inject

Я хочу протестировать маршруты hapi с помощью лаборатории, я использую базу данных mysql.

Проблема с использованием Server.inject для проверки маршрута заключается в том, что я не могу имитировать базу данных, потому что я не вызываю файл, содержащий функцию обработчика, так как мне внедрить фиктивную базу данных в обработчик?


person Manan Vaghasiya    schedule 14.08.2014    source источник
comment
Какая у вас конкретно проблема? inject должно работать. inject должен быть идентичен реальному запросу с точки зрения кодирования.   -  person arb    schedule 17.08.2014
comment
Я хочу имитировать вызовы базы данных при тестировании конечных точек.   -  person Manan Vaghasiya    schedule 24.08.2014
comment
вы с этим чего-нибудь добились? хотите использовать hapijs для API и захотите имитировать вызовы БД для тестов.   -  person Adamski    schedule 27.09.2014
comment
@Adamski см. мой ответ ниже.   -  person SlightlyCuban    schedule 03.03.2015


Ответы (1)


Вы должны иметь возможность использовать что-то вроде 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');
});
person SlightlyCuban    schedule 02.03.2015
comment
Что вы подразумеваете под «кэшированным требованием»? - person Manan Vaghasiya; 03.03.2015
comment
@MananVaghasiya см. nodejs.org/api/globals.html#globals_require_cache . После разрешения require будет кэшировать объект, а последующие вызовы require для модуля вернут кэшированный экземпляр указанного модуля. - person SlightlyCuban; 03.03.2015