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”,“测试”]但它从未被调用过。我不明白我在这里做错了什么。
通过测试床创建不使用'新MockUploadService()',后来的组件。为什么呢?您需要获取对组件中注入的实际服务的引用,并监视该实例。 –
@JBNizet,我能以另一种方式做到这一点。我已经使用.overrideComponent(ExportImportRulesComponent,{ 集合:{ 提供商: {提供:UploadService,useClass:MockUploadService} ] } });在beforeEach方法中。这样我就可以嘲笑这项服务。不知道这是否是一种好方法。 – nikhil