如何使用 Jasmine (Angular) 轻松模拟服务 HTTP 请求?
How to easily mock a service HTTP request with Jasmine (Angular)?
为什么这个间谍不起作用?我正在创建一个 prescriptionService 的实例并监视 fetchClientPrescriptions
方法,但是当我检查它是否被调用时,我收到一个错误。然而 getClientPrescriptions
的第一个间谍工作得很好。
测试:
let prescriptions = [
{"ndcpackage": "58160082552", "form": "1.0ML Syringe", "name": "Havrix", "dosage": "Havrix INJ 720UNIT", "quantity": "3", "refill_freq": 30},
{"ndcpackage": "59310058020", "form": "1.0EA Box", "name": "Proair Respiclick", "dosage": "Proair Respiclick AER", "quantity": "0", "refill_freq": 30}
];
it('should fetch client prescriptions if clientId is provided', async(() => {
let spyC = spyOn(component, 'getClientPrescriptions');
let spyS = spyOn(prescriptionService, 'fetchClientPrescriptions').and.returnValue(of(prescriptions));
component.clientId = 5;
component.ngOnInit();
fixture.whenStable().then(() => {
expect(spyC).toHaveBeenCalled();
expect(spyS).toHaveBeenCalled();
expect(component.currentPrescriptions).toEqual(prescriptions);
});
}));
服务:
fetchClientPrescriptions(id: any) {
return this.http.get<DrugSelection[]>(environment.apiURL + '/fetch-client-rx/' + id);
}
组件:
ngOnInit() {
if (this.clientId != null) {
this.getClientPrescriptions();
}
}
getClientPrescriptions() {
this.prescriptionService.fetchClientPrescriptions(this.clientId).subscribe(p => {
this.dataSource = new MatTableDataSource<DrugSelection>(p);
this.dataSource.sort = this.sort;
this.currentPrescriptions = p;
});
}
错误:
Error: Expected spy fetchClientPrescriptions to have been called.
at <Jasmine>
at http://localhost:9876/_karma_webpack_/src/app/client/client-prescriptions/client-prescriptions.component.spec.ts:48:20
at ZoneDelegate.invoke (http://localhost:9876/_karma_webpack_/C:/Users/BHanna/Documents/my-mfg/mymfg-spring-agents/src/main/webapp/node_modules/zone.js/dist/zone.js:396:1)
at AsyncTestZoneSpec.onInvoke (http://localhost:9876/_karma_webpack_/C:/Users/BHanna/Documents/my-mfg/mymfg-spring-agents/src/main/webapp/node_modules/zone.js/dist/async-test.js:102:1)
Error: Expected $.length = 0 to equal 2.
Expected $[0] = undefined to equal Object({ ndcpackage: '58160082552', form: '1.0ML Syringe', name: 'Havrix', dosage: 'Havrix INJ 720UNIT', quantity: '3', refill_freq: 30 }).
Expected $[1] = undefined to equal Object({ ndcpackage: '59310058020', form: '1.0EA Box', name: 'Proair Respiclick', dosage: 'Proair Respiclick AER', quantity: '0', refill_freq: 30 }).
at <Jasmine>
at http://localhost:9876/_karma_webpack_/src/app/client/client-prescriptions/client-prescriptions.component.spec.ts:49:46
at ZoneDelegate.invoke (http://localhost:9876/_karma_webpack_/C:/Users/BHanna/Documents/my-mfg/mymfg-spring-agents/src/main/webapp/node_modules/zone.js/dist/zone.js:396:1)
at AsyncTestZoneSpec.onInvoke (http://localhost:9876/_karma_webpack_/C:/Users/BHanna/Documents/my-mfg/mymfg-spring-agents/src/main/webapp/node_modules/zone.js/dist/async-test.js:102:1)
在 Spy let spyC = spyOn(component, 'getClientPrescriptions');
中,您正在设置一个 spy,但该 spy 仅拦截调用并且不会进一步进行。你必须像这样完成它:
let spyC = spyOn(component, 'getClientPrescriptions').and.callThrough();
这样调用实际方法,然后调用 fetchClientPrescriptions
方法。
为什么这个间谍不起作用?我正在创建一个 prescriptionService 的实例并监视 fetchClientPrescriptions
方法,但是当我检查它是否被调用时,我收到一个错误。然而 getClientPrescriptions
的第一个间谍工作得很好。
测试:
let prescriptions = [
{"ndcpackage": "58160082552", "form": "1.0ML Syringe", "name": "Havrix", "dosage": "Havrix INJ 720UNIT", "quantity": "3", "refill_freq": 30},
{"ndcpackage": "59310058020", "form": "1.0EA Box", "name": "Proair Respiclick", "dosage": "Proair Respiclick AER", "quantity": "0", "refill_freq": 30}
];
it('should fetch client prescriptions if clientId is provided', async(() => {
let spyC = spyOn(component, 'getClientPrescriptions');
let spyS = spyOn(prescriptionService, 'fetchClientPrescriptions').and.returnValue(of(prescriptions));
component.clientId = 5;
component.ngOnInit();
fixture.whenStable().then(() => {
expect(spyC).toHaveBeenCalled();
expect(spyS).toHaveBeenCalled();
expect(component.currentPrescriptions).toEqual(prescriptions);
});
}));
服务:
fetchClientPrescriptions(id: any) {
return this.http.get<DrugSelection[]>(environment.apiURL + '/fetch-client-rx/' + id);
}
组件:
ngOnInit() {
if (this.clientId != null) {
this.getClientPrescriptions();
}
}
getClientPrescriptions() {
this.prescriptionService.fetchClientPrescriptions(this.clientId).subscribe(p => {
this.dataSource = new MatTableDataSource<DrugSelection>(p);
this.dataSource.sort = this.sort;
this.currentPrescriptions = p;
});
}
错误:
Error: Expected spy fetchClientPrescriptions to have been called.
at <Jasmine>
at http://localhost:9876/_karma_webpack_/src/app/client/client-prescriptions/client-prescriptions.component.spec.ts:48:20
at ZoneDelegate.invoke (http://localhost:9876/_karma_webpack_/C:/Users/BHanna/Documents/my-mfg/mymfg-spring-agents/src/main/webapp/node_modules/zone.js/dist/zone.js:396:1)
at AsyncTestZoneSpec.onInvoke (http://localhost:9876/_karma_webpack_/C:/Users/BHanna/Documents/my-mfg/mymfg-spring-agents/src/main/webapp/node_modules/zone.js/dist/async-test.js:102:1)
Error: Expected $.length = 0 to equal 2.
Expected $[0] = undefined to equal Object({ ndcpackage: '58160082552', form: '1.0ML Syringe', name: 'Havrix', dosage: 'Havrix INJ 720UNIT', quantity: '3', refill_freq: 30 }).
Expected $[1] = undefined to equal Object({ ndcpackage: '59310058020', form: '1.0EA Box', name: 'Proair Respiclick', dosage: 'Proair Respiclick AER', quantity: '0', refill_freq: 30 }).
at <Jasmine>
at http://localhost:9876/_karma_webpack_/src/app/client/client-prescriptions/client-prescriptions.component.spec.ts:49:46
at ZoneDelegate.invoke (http://localhost:9876/_karma_webpack_/C:/Users/BHanna/Documents/my-mfg/mymfg-spring-agents/src/main/webapp/node_modules/zone.js/dist/zone.js:396:1)
at AsyncTestZoneSpec.onInvoke (http://localhost:9876/_karma_webpack_/C:/Users/BHanna/Documents/my-mfg/mymfg-spring-agents/src/main/webapp/node_modules/zone.js/dist/async-test.js:102:1)
在 Spy let spyC = spyOn(component, 'getClientPrescriptions');
中,您正在设置一个 spy,但该 spy 仅拦截调用并且不会进一步进行。你必须像这样完成它:
let spyC = spyOn(component, 'getClientPrescriptions').and.callThrough();
这样调用实际方法,然后调用 fetchClientPrescriptions
方法。