Error: <toHaveBeenCalled> : Expected a spy, but got undefined
Error: <toHaveBeenCalled> : Expected a spy, but got undefined
我收到一个预期的间谍错误,但在我的 angular 10 测试中未定义。我正在使用 Jasmine 和 Karma。我将服务 SpreadsheetService 模拟为 mockSpreadSheetService。我正在调用它的方法。我不明白为什么它期待间谍。
我能想到的一个可能原因是 mockSpreadSheetService 在 运行 测试之前创建,我们正在调用 component.ngOnit 这可能会重新创建组件实例。我试图在 component.ngOnit 之后显式创建模拟服务,但它仍然没有工作。
我的问题理想情况下,我们应该在模拟对象上进行测试。为什么需要间谍。
expect(mockSpreadSheetService.loadXML).toHaveBeenCalled();
测试组件
let component: SpreadsheetComponent;
let fixture: ComponentFixture<SpreadsheetComponent>;
let mockSpreadSheetService;
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
declarations: [SpreadsheetComponent],
providers: [{SpreadsheetService, useFactory: () => mockSpreadSheetService.Object}]
})
.compileComponents();
}));
beforeEach(() => {
mockSpreadSheetService = new Mock<SpreadsheetService>({
loadXML: () => of(xmlData)
});
fixture = TestBed.createComponent(SpreadsheetComponent);
component = fixture.componentInstance;
//fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
it('should call loadXML when ngOnInit is called', fakeAsync(() => {
// spyOn(component.spreadsheetService, 'loadXML');
component.ngOnInit();
tick();
expect(mockSpreadSheetService.loadXML).toHaveBeenCalled();
}));
});
主要成分
ngOnInit(): void {
this.spreadsheetService.loadXML().subscribe((data) => {
this.parseXML(data)
.then((data) => {
console.log('data is ' , data);
this.xmlItems = data;
});
});
}
间谍未正确创建。
这是它的样子:
let component: SpreadsheetComponent;
let fixture: ComponentFixture<SpreadsheetComponent>;
let mockSpreadSheetService;
beforeEach(async(() => {
mockSpreadSheetService = jasmine.createSpyObj(['loadXML']);
mockSpreadSheetService.loadXML.and.returnValue(of());
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
declarations: [SpreadsheetComponent],
providers: { provide: SpreadsheetService, useValue: mockSpreadSheetService }
});
fixture = TestBed.createComponent(SpreadsheetComponent);
component = fixture.componentInstance;
fixture.detectChanges();
}));
it('should create', () => {
expect(component).toBeTruthy();
});
it('should call loadXML when ngOnInit is called', () => {
component.ngOnInit();
expect(mockSpreadSheetService.loadXML).toHaveBeenCalled();
});
});
我收到一个预期的间谍错误,但在我的 angular 10 测试中未定义。我正在使用 Jasmine 和 Karma。我将服务 SpreadsheetService 模拟为 mockSpreadSheetService。我正在调用它的方法。我不明白为什么它期待间谍。
我能想到的一个可能原因是 mockSpreadSheetService 在 运行 测试之前创建,我们正在调用 component.ngOnit 这可能会重新创建组件实例。我试图在 component.ngOnit 之后显式创建模拟服务,但它仍然没有工作。
我的问题理想情况下,我们应该在模拟对象上进行测试。为什么需要间谍。
expect(mockSpreadSheetService.loadXML).toHaveBeenCalled();
测试组件
let component: SpreadsheetComponent;
let fixture: ComponentFixture<SpreadsheetComponent>;
let mockSpreadSheetService;
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
declarations: [SpreadsheetComponent],
providers: [{SpreadsheetService, useFactory: () => mockSpreadSheetService.Object}]
})
.compileComponents();
}));
beforeEach(() => {
mockSpreadSheetService = new Mock<SpreadsheetService>({
loadXML: () => of(xmlData)
});
fixture = TestBed.createComponent(SpreadsheetComponent);
component = fixture.componentInstance;
//fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
it('should call loadXML when ngOnInit is called', fakeAsync(() => {
// spyOn(component.spreadsheetService, 'loadXML');
component.ngOnInit();
tick();
expect(mockSpreadSheetService.loadXML).toHaveBeenCalled();
}));
});
主要成分
ngOnInit(): void {
this.spreadsheetService.loadXML().subscribe((data) => {
this.parseXML(data)
.then((data) => {
console.log('data is ' , data);
this.xmlItems = data;
});
});
}
间谍未正确创建。
这是它的样子:
let component: SpreadsheetComponent;
let fixture: ComponentFixture<SpreadsheetComponent>;
let mockSpreadSheetService;
beforeEach(async(() => {
mockSpreadSheetService = jasmine.createSpyObj(['loadXML']);
mockSpreadSheetService.loadXML.and.returnValue(of());
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
declarations: [SpreadsheetComponent],
providers: { provide: SpreadsheetService, useValue: mockSpreadSheetService }
});
fixture = TestBed.createComponent(SpreadsheetComponent);
component = fixture.componentInstance;
fixture.detectChanges();
}));
it('should create', () => {
expect(component).toBeTruthy();
});
it('should call loadXML when ngOnInit is called', () => {
component.ngOnInit();
expect(mockSpreadSheetService.loadXML).toHaveBeenCalled();
});
});