Я пытаюсь настроить шаблон тестирования для нового приложения Hapi. Я использовал Mocha и Chai в прошлом с Express, но я пытаюсь использовать Lab и Code, чтобы оставаться в экосистеме Hapi. Я также использую Bookshelf и Knex для обработки взаимодействия с базами данных.Как использовать Sinon для завершения ночных звонков в Hapi/Lab test?
Итак, у меня есть простая конечная точка здоровья, которую я бы хотел проверить.
'use strict';
const controller = require('../controller/healthController');
module.exports = [
{
method: 'GET',
path: '/health',
config: {
handler: controller.health,
description: 'The health endpoint returns 200',
tags: ['api', 'health']
}
}
];
В обработчике он просто выполняет быстрый запрос, чтобы убедиться, что он может подключаться к БД.
'use strict';
const bookshelf = require('../config/db');
const knex = bookshelf.knex;
module.exports = {
health: function (request, reply) {
knex.raw('SELECT version()').then(() => {
reply('service is running');
}).catch((err) => {
reply({err: err, code: 500});
});
}
};
Насколько я понимаю, что требует сервер, а затем с помощью server.inject на самом деле не запустить сервер, поэтому я не считаю, что я должен иметь соединение с базой данных, что означало бы я должен издеваться над вызовом db. Что странно для меня, так это то, что проходит этот тест:
'use strict';
const Code = require('code');
const Lab = require('lab');
const lab = exports.lab = Lab.script();
const describe = lab.describe;
const it = lab.test;
const expect = Code.expect;
const before = lab.before;
let server;
describe('health controller',() => {
before((done) => {
server = require('../../server');
done();
});
it('health check replies 200 when successful call to db', (done) => {
const options = {
method: 'GET',
url: '/health'
};
server.inject(options, (res) => {
expect(res.payload).to.include('is running');
expect(res.statusCode).to.equal(200);
done();
});
});
});
У меня есть две проблемы. Во-первых, я чувствую, что тест выше не должен проходить. Если он не загружает все и, таким образом, подключается к db, я полагаю. Может быть, я должен тестировать только метод контроллера/обработчика? Но я не нашел примеров этого.
Во-вторых, я пытался в любом случае отключить вызов knex.raw, и когда я попытаюсь сделать это, как показано ниже, я получаю ошибку 500.
'use strict';
const Code = require('code');
const Lab = require('lab');
const Sinon = require('sinon');
const lab = exports.lab = Lab.script();
const describe = lab.describe;
const it = lab.test;
const expect = Code.expect;
const before = lab.before;
let server;
let knex = require('../../app/config/db').knex;
describe('health controller',() => {
before((done) => {
server = require('../../server');
done();
});
it('health check replies 200 when successful call to db', (done) => {
const stub = Sinon.stub(knex, 'raw').returns({});
const options = {
method: 'GET',
url: '/health'
};
server.inject(options, (res) => {
expect(res.payload).to.include('is running');
expect(res.statusCode).to.equal(200);
expect(stub.calledOnce).to.be.true();
done();
});
});
});
Я не совсем уверен, почему это происходит.
Как выглядит ваш 'require ('../../ app/config/db')'? На первом этапе попробуйте встроить весь код запроса в файл тестового файла, чтобы быть уверенным в том, что насмешливость работает так, как вы ожидаете, а затем по частям перемещать код, чтобы исправить место, чтобы найти точное место, где материал не работал, как вы ожидали , –
Укажите исходный код '' ../../ server''. Пожалуйста, укажите сообщение об ошибке 500 и любых журналах с консоли. –
Был ли мой ответ полезным для вас каким-либо образом? –