2016-11-20 91 views
3

我测试的组件说:导出和导入文件,它使用了一个名为uploadService.ts角2 - 单元测试谍照不叫

服务uploadService有一个方法SENDFILE这是由组件的方法importRules内部称为()。

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) { 
    … 
    } 
} 

相应的说明文件 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); 
      } 
     } 

而在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'); 
       }); 

     })); 

但在执行我收到错误的测试:预计间谍SENDFILE已经调用[“file.json”,“测试”]但它从未被调用过。我不明白我在这里做错了什么。

+0

通过测试床创建不使用'新MockUploadService()',后来的组件。为什么呢?您需要获取对组件中注入的实际服务的引用,并监视该实例。 –

+0

@JBNizet,我能以另一种方式做到这一点。我已经使用.overrideComponent(ExportImportRulesComponent,{ 集合:{ 提供商: {提供:UploadService,useClass:MockUploadService} ] } });在beforeEach方法中。这样我就可以嘲笑这项服务。不知道这是否是一种好方法。 – nikhil

回答

3

使用spyOn以下列方式:

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');