새로운 Hapi 앱의 테스트 패턴을 설정하려고합니다. Express와 함께 Mocha와 Chai를 사용했지만 Hapi 생태계에 머물기 위해 Lab 및 Code를 사용하려고합니다. 또한 Bookshelf와 Knex를 사용하여 데이터베이스 상호 작용을 처리합니다.Hapi/Lab 테스트에서 Sinon을 사용하여 knex 호출을 스텁하는 방법은 무엇입니까?
그래서 테스트 할 간단한 건강 종점이 있습니다.
핸들러에서 DB에 연결할 수 있는지 확인하기위한 빠른 쿼리 만 수행합니다.
'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});
});
}
};
지금까지 내가 내가 내가가해야 의미 DB를 연결을해야한다고 생각하지 않아도 실제로 서버를 시작하지 않는 server.inject를 사용하여 다음 서버를 필요로하고, 그것을 이해 db call을 조롱해라. 이상한 점은이 테스트가 통과한다는 것입니다.
'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 오류 메시지와 콘솔의 모든 로그를 포함하십시오. –
내 대답이 어떤 식 으로든 도움이 되었습니까? –