2017-01-17 13 views
0

새로운 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(); 
    }); 

    }); 

}); 

나는 왜 그런 일이 일어나고 있는지 잘 모르겠습니다.

+0

'require ('../../ app/config/db')는 어떻게 생겼습니까? 첫 번째 단계에서는 테스트 케이스 파일의 모든 쿼리 코드를 인라인하여 예상대로 조롱이 작동하는지 확인한 다음 코드를 이동하여 올바른 위치로 이동하여 예상대로 작동하지 않는 정확한 위치를 찾습니다. . –

+0

''../../ server ''소스 코드를 포함하십시오. 500 오류 메시지와 콘솔의 모든 로그를 포함하십시오. –

+0

내 대답이 어떤 식 으로든 도움이 되었습니까? –

답변

0

server.inject은 실제 서버을 요청한 것처럼 정확하게 처럼 작동합니다. 따라서 테스트가 실행될 때 데이터베이스가 가동 중이면 엔드 포인트는 서버를 수동으로 시작할 때와 마 y 가지로 데이터베이스에서 데이터를 리턴합니다.

Sinon.stub(knex, 'raw').returns({});은 작동하지 않습니다. knex.raw(…)은 빈 개체가 아니라 Promise를 반환 할 것으로 예상됩니다. 다음을 시도하십시오 :

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

그냥 보조 노트를 : 테스트 사이에 지속없는 상태가 없습니다 보장하기 위해 각 테스트 후 server.stop()를 호출해야합니다. 일반적으로 Hapi University repository의 예제 테스트 파일을 살펴볼 수 있다고 생각합니다.