2017-02-27 1 views
3

컨트롤러가 처리하는 Express 루트가 있습니다. 컨트롤러는 서비스를 사용하며 서비스는 저장소를 사용하여 데이터 소스와 통신합니다.Typescript/Node.js - 통합 테스트를 위해 전이 의존성을 조롱하는 방법?

내가 그 길을 테스트 Supertest를 사용하여 통합 테스트를 만들려는 :

test -> my Express app -> controller -> service -> repository -> data source 

내 문제는 내가 테스트를 실행, 모의 저장소/데이터 소스에 필요합니다! 실제 데이터 소스에서 오는 것처럼 일부 값을 하드 코딩하고 싶습니다. 내 옵션은 무엇입니까?

자바 세계에서 나는 스프링이나 Guice와의 의존성 삽입을 사용하고 있으며 저장소를 위와 같은 방법으로 대체 할 것입니다. Typescript/Node.js 세계에서 그런 조롱을 얻기위한 패턴은 무엇입니까?

평범한 자바 스크립트를 사용하면 ProxyquireGlobally override require 기능을 사용하여 테스트 자체에서 저장소를 조롱 할 수 있다고 생각합니다. 하지만 Typescript가 잘 작동하는지 잘 모르겠습니다.

따라서 Typescript와 Node.js를 사용하여 테스트 파일 내에서 "깊은"구성 요소 (전이 종속성)를 조롱하는 권장 방법은 무엇입니까?

+0

를 사용합니다 알고, 테스트를 실행 : // github.com/jaredhanson/electrolyte) 의존성 주입/IoC를 수행합니다. 'IoC.use (..)'함수를 사용하여 역순으로 검색 할 폴더를 설정합니다. 따라서 테스트 용 부트 스트랩 파일에서 내 모의 폴더를 추가하여 맨 먼저 보이게하고 모의 데이터 소스를 해결합니다 내 다른 폴더 또는 노드 모듈의 데이터 소스 대신 –

답변

4

모듈은 처음로드 된 후 캐시되므로 테스트 파일에서 모듈을로드하고 sinon과 같은 라이브러리를 사용하여 모듈을 스텁 할 수 있습니다.

다음 코드를 고려하십시오

// dependency.ts 
export function foo(){ 
    return 'foo'; 
} 

// app.ts 
import {foo} from './dependency'; 
export default function main(){ 
    return 'winner ' + foo(); 
} 
당신은 app.ts은 다음과 같은 방법으로 sinon과의 종속 관계를 스텁 테스트 할 수

: 당신의 통합 테스트 가져올 수 그루터기 그래서 기본적으로

import * as Dependency from '../src/dependency'; 
import main from '../src/app'; 

describe('test dependency',() => { 
    var fooStub; 
    beforeEach(() => { 
     fooStub = sinon.stub(Dependency, 'foo'); 
     fooStub.returns('la la lang'); 
    }); 
    afterEach(()=>{ 
     fooStub.restore(); 
    }) 

    it('uses stubbed dependency',()=>{ 
     expect(main()).to.be.equal('winner la la lang'); 
    }); 

    it('can return different values on other tests',()=>{ 
     fooStub.returns('moonlight'); 
     expect(main()).to.be.equal('winner moonlight'); 
    }); 
}); 

앱을 시작하기 전에 당신의 의존성. app.proxy에서

  • 이 저장소를 가져오고 미리 정의 된 데이터를 반환 할 스텁 :이이 app.proxy.ts 파일을 작성 했어요. 스텁을 설정 한 후 실제 app.ts을 가져 와서 내 보냅니다.
  • 통합 테스트 파일에서 앱 대신 app.proxy을 가져 와서 supertest와 함께 사용하십시오. 이것은 결국 당신에게 응용 프로그램을 줄 것이다,하지만 stubbed 종속성을 설정 한 후!
  • 쓰기와 [전해질 (HTTPS라는 여권의 창조자에 의해 아름다운 도서관이있다, 당신은 오히려 타이프 라이터보다는 일반 노드를 사용하는 경우는 미리 정의 된 데이터
관련 문제