2017-03-05 2 views
2

저는 테스트하기가 상당히 쉽습니다. 시몬에게 새로운 것입니다. Sinon을 사용하여 상수/변수 모의?

여기에 내가 명시 적 경로 설정이 있습니다

import context = require("aws-lambda-mock-context"); 

this.router.post('/', this.entryPoint); 

public entryPoint(req: Request, res: Response, next: NextFunction) { 
    const ctx = context(); 
    alexaService.execute(req.body, ctx); 
    ctx.Promise 
     .then((resp: Response) => res.status(200).json(resp)) 
     .catch((err: Error) => res.status(500)); 
} 

내 목표는 적절하게 그 후 호출에 / 실행을 테스트하는 것입니다. 내 테스트 스크립트는 다음과 같습니다 내 시험이 때문에하지 인정되는 const ctx = context()status: 500을 반환 통과

describe('/POST /',() => { 
    it('should post',() => { 
     chai.request(app) 
      .post('/v2') 
      .end((err, res) => { 
       expect(res).to.be.ok; 
      }); 
    }); 
}); 

있지만. 변수 ctx을 감시하고 Sinon을 사용하여 내 테스트에서 모의 ​​변수를 반환하는 적절한/올바른 방법이 있습니까? 나는 오랫동안 나의 바퀴를 여기에서 돌고 있었다.

답변

4

이것은 내가 일반적으로 보아온 공통적 인 문제입니다. 여러 솔루션을 테스트 한 결과, 가장 잘 작동하는 것으로 발견 된 제품은 Mockery입니다.

다음과 같이 작동합니다. 테스트중인 모듈을 요구하기 전에 테스트 대상 모듈이 필요로하는 모듈을 mockery로 대체하도록 Mockery에 지시합니다. 코드에 대한

, 그것은 같은 것을 보일 것이다 :이 오래 알고

const mockery = require('mockery'); 
const { spy } = require('sinon'); 

describe('/POST /',() => { 
    let ctxSpy; 
    beforeEach(() => { 
     mockery.enable({ 
      useCleanCache: true, 
      warnOnUnregistered: false 
     }); 
     ctxSpy = spy(); 
     mockery.registerMock('"aws-lambda-mock-context"', ctxSpy); 

     // change this to require the module under test 
     const myRouterModule = require('my-router-module'); 

     myRouterModule.entryPoint({}, {},() => {}); 
     return ctxSpy; 
    }); 

    it('should call ctx',() => { 
     expect(ctxSpy).called.to.be.ok; 
    }); 

    afterEach(() => { 
     mockery.deregisterAll(); 
     mockery.disable(); 
    }); 
}); 
+0

,하지만 난 당신이 : –

+0

오른쪽 테스트중인 모듈을 필요로하기 전에'mockery.registerAllowable'를 사용하는 것이 좋습니다, 깜빡 내가 그걸 내 설치에 숨겨서 언급 했어. –

관련 문제