2017-01-17 17 views
0

Я пытаюсь настроить шаблон тестирования для нового приложения 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(); 
    }); 

    }); 

}); 

Я не совсем уверен, почему это происходит.

+0

Как выглядит ваш 'require ('../../ app/config/db')'? На первом этапе попробуйте встроить весь код запроса в файл тестового файла, чтобы быть уверенным в том, что насмешливость работает так, как вы ожидаете, а затем по частям перемещать код, чтобы исправить место, чтобы найти точное место, где материал не работал, как вы ожидали , –

+0

Укажите исходный код '' ../../ server''. Пожалуйста, укажите сообщение об ошибке 500 и любых журналах с консоли. –

+0

Был ли мой ответ полезным для вас каким-либо образом? –

ответ

0

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

Sinon.stub(knex, 'raw').returns({}); не будет работать. Ожидается, что knex.raw(…) вернет обещание, а не пустой объект. Пожалуйста, попробуйте следующее:

Sinon.stub(knex, 'raw').returns(Promise.resolve({})); 

Просто побочное замечание: не забудьте позвонить server.stop() после каждого испытания, чтобы обеспечить нет состояния сохранялось между тестами. В общем, я думаю, вы можете посмотреть пример тестовых файлов в Hapi University repository.

 Смежные вопросы

  • Нет связанных вопросов^_^