2017-04-03 4 views
0

일부 서비스 AService를 테스트하고 싶습니다. 다른 서비스 e.x에 의존하는 BService가 있습니다. CService. 우리는이 의존성과 같은 체인 :테스트 체인 종속 서비스

AService -> BService -> CService

AService 생성자 :

constructor(
    private bService: BService 
) {} 

BService 생성자 :

constructor(
    private cService: CService 
) {} 

내가에서 테스트 AService를 원한다면 내 테스트 파일 나는 다음과 같이 작성해야한다 :

beforeAll(() => { 
     injector = ReflectiveInjector.resolveAndCreate([ 
      AService, 
      BService, 
      CService, 
     ]); 

     service = injector.get(AService); 
    }); 

그리고 서비스가 너무 많아서 서로 쇠사슬로 묶여 있으면 너무 많은 상용구가 생깁니다.

내 AService 테스트 파일에 연결된 서비스를 모두 삽입하지 않는 방법이 있습니까?

답변

1

코드를 테스트 할 때 실제 종속성을 포함하지 않는 것이 이상적입니다. 대신 모의 서비스 B를 제공하고 그 종속성을 스텁링해야합니다.

describe('AService',() => { 
     beforeAll(() => { 
      injector = ReflectiveInjector.resolveAndCreate([ 
       AService, 
       {provide: BService, useClass: MockBService} 
       ]); 
      Aservice = injector.get(AService); 
     }); 
    }); 


    class MockBService { 
     // enter mock functions here that you want to invoke from Service A 
     // this does not have dependency on Service C 
    } 

테스트에서는 서비스 B에 대한 호출을 간첩하고 원하는 모든 값을 반환 할 수 있습니다.

const BService = AService.injector.get(BService); 
    spyOn(BService, 'someFunc').and.returnValue(1); 
관련 문제