2016-10-12 6 views
1

테스트중인 함수는 대략 비슷합니다.차이 (chai)와 스론 (sinon)을 사용하여 메소드 내에서 약속을 스텁하기

function doThing(data, callback) { 

    externalService.post('send').request(data) 
     .then(() => { 
      if (callback) { callback(); } 
     }) 
     .catch((message) => { 
      logger.warn('warning message'); 
      if (callback) { callback(); } 
     }); 
    } 

그리고 나는 이것을 Chai와 Sinon을 사용하여 테스트하려고합니다.

다른 가이드를 따라 시도해 보았습니다. 현재의 주문은 다음과 같습니다. 내가 externalService.post 얻을 수

const thingBeingTested = require('thing-being-tested'); 
const chai = require('chai'); 
const sinon = require('sinon'); 
require('sinon-as-promised'); 
const sinonChai = require('sinon-chai'); 
const expect = chai.expect; 

var chaiAsPromised = require('chai-as-promised'); 
chai.use(chaiAsPromised); 
chai.use(sinonChai); 

describe('The Thing',() => { 
    it('should run a callback when requested and successful', done => { 

    const externalService = { post: { request: sinon.stub() } }; 
    const callback = sinon.spy(); 

    externalService.post.request.resolves(callback); 

    doThing({...}, callback); 
    expect(callback).to.have.been.called; 
    done(); 
    }); 
}); 

는 올바르게 스텁. 어떤 도움이라도 대단히 감사하겠습니다.

나는 Chai와 Sinon에 완전히 새로운 것이므로, 어리석은 짓을하기를 완전히 기대한다.

+0

으로 복원하는 것을 잊지 마세요 당신이 프록시 nodejs가 요구하는 [proxyquire] (https://github.com/thlorenz/proxyquire)를 사용하여 고려 되세요 테스트 중에 의존성을 무시할 수있게하려면? 'nodejs '에서 테스트 할 때 사용할 유용한 도구이며 내 의견으로는 테스트가 더 간단합니다. – hyprstack

+0

고마워요 @hyprstack - 나는 그것에 대해 들어 본 적이 없었습니다. 이 사용 사례에 대해 이해가되는지 살펴볼 것입니다 (예제에서는 한 가지 테스트가 있었지만, 물론 운동이 필요한 몇 가지 다른 것들이 있습니다). – Toby

답변

1

doThing 함수는 테스트에서 const externalService에 액세스 할 수 없습니다. 귀하의 주 파일은

const externalService = require('./external_service'); 

과 같은 smth가 있다고 가정합니다.

describe(...,() => { 
    it(...,() => { 
     // adjust the path accordingly 
     const externalService = require('./external_service'); 

를 다음의 방법 조롱 : 테스트에서

당신도 같은 externalService을 얻어야한다

sinon.stub(externalService, 'post').returns({ 
    request: sinon.stub().resolves(callback) 
}); 

그런 다음 doThing를 호출하고 결과를 분석 할 수 있습니다.

테스트가 완료되면, 원래 post

externalService.post.restore();