2016-11-20 2 views
3

내가 구성 요소를 테스트하고 말 호출되지 : 가져 오기 및 내보내기 파일 uploadService가) (컴포넌트 메소드 importRules에 의해 내부적으로 호출되는 방법에 sendfile을 가지고 uploadService.ts각도 2 - 단위 테스트 스파이는

라는 서비스를 사용한다.

uploadService.ts

@Injectable() 
export class UploadService { 

    constructor(private http: Http, private sharedData: SharedDataService) { } 

    sendFile(file: File, groupName?: string): Observable<Response> { 
     … 
     return this.http.post(url, data, options); 
    } 
} 

exportImport.components.ts

ImportRules() { 
    this.uploadService.sendFile(fileObj, fileName) { 
    … 
    } 
} 

대응 spec 파일 exportImport.components.spec.ts

class MockUploadService extends UploadService { 
      constructor() { 
       super(null, null); 
      } 

      sendFile(file: File, groupName?: string): Observable<Response> { 
       let resObject = new Response(null); 
       resObject.status = 200; 
       return Observable.of(resObject); 
      } 
     } 
[ 'file.json', '테스트']으로 호출 된 것으로 스파이 sendfile을 예상 :

그리고는 beforeEach에서 나는 모의 서비스

it('should import ioc rules', 
     async(() => { 
      TestBed 
       .compileComponents() 
       .then(() => { 
        let fixture = TestBed.createComponent(TestComponent); 
        // let http = new ConnectionBackend(); 
        let exportImportInstance = fixture.debugElement.children[0].componentInstance; 
        let mockReq: MockUploadService = new MockUploadService(); 
        exportImportInstance.setGroupName('test'); 
        exportImportInstance.setChosenFile('file.json'); 
        spyOn(mockReq, 'sendFile'); 
        exportImportInstance.importRules(); 
        expect(mockReq.sendFile).toHaveBeenCalledWith('file.json', 'test'); 
       }); 

     })); 

로하지만 오류가 무엇입니까 테스트를 실행에 실제 서비스를 대체했다 그러나 결코 부름을받지 않았습니다. 나는 내가 여기서 잘못하고있는 것을 얻지 못하고있다. 다음과 같은 방법으로

+0

구성 요소입니다. 왜 그랬을까요? 구성 요소에 주입 된 실제 서비스에 대한 참조를 얻고 해당 인스턴스를 간첩해야합니다. –

+0

@JBNizet, 나는 다른 방식으로 그것을 할 수 있습니다. I는 .overrideComponent 사용한 (ExportImportRulesComponent { 세트 { 제공자 : {제공 UploadService, useClass : MockUploadService를} ] }}); beforeEach 메서드에서. 이렇게하면 서비스를 조롱 할 수 있습니다. 그것이 좋은 방법인지 아닌지 확실하지 않습니다. – nikhil

답변

3

사용 spyOn : 나중에,()`은`새 MockUploadService를 사용하지 않는 테스트 베드에 의해 생성

let fixture = TestBed.createComponent(TestComponent); 
const mockResponse = { 'name': 'uploaded' }; 
let spy: jasmine.Spy = spyOn(mockUploadService,'sendFile').and.returnValue(Observable.of(
         new Response(new ResponseOptions({ body: mockResponse })))); 
expect(spy.calls.any()).toBe(true, 'spy send file of upload is called'); 
expect(spy.calls.first().args[0]).toBe('file.json'); 
관련 문제