无法读取未定义的属性(读取 'pipe')
Cannot read properties of undefined (reading 'pipe')
服务
export interface ITransferRequest {
serviceName:string;
amount:number
}
@Injectable()
export class TransferService
{
transferMoneyUrl = 'https://localhost:44321/api/TransferService';
constructor(private http:HttpClient){}
doTransfer(transferRequest: ITransferRequest): Observable<TransferResult> {
return this.http.post<TransferResult>(this.transferMoneyUrl, transferRequest).pipe();
}
}
测试代码
describe('AppComponent', () => {
let transferService: TransferService,
mockHttp: any;
beforeEach(async () => {
mockHttp = jasmine.createSpyObj('mockHttp',['get', 'post']);
transferService = new TransferService(mockHttp);
await TestBed.configureTestingModule({
imports: [
RouterTestingModule
],
declarations: [
AppComponent
],
}).compileComponents();
});
it('should do transfer', done => {
const transferRequest: ITransferRequest = { serviceName: "A", amount: 1000 };
mockHttp.get.and.returnValue(of(<TransferResult>{ result : 600 }));
transferService.doTransfer(<ITransferRequest>transferRequest)
.subscribe((x: TransferResult) => {
expect(x.result).toBe(600);
done();
});
});
错误
TypeError: Cannot read properties of undefined (reading 'pipe')
at TransferService.doTransfer (http://localhost:9876/_karma_webpack_/webpack:/src/app/services/transfer.service.ts:32:86)
at UserContext.<anonymous> (http://localhost:9876/_karma_webpack_/webpack:/src/app/app.component.spec.ts:35:21)
at _ZoneDelegate.invoke (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/fesm2015/zone.js:372:1)
at ProxyZoneSpec.onInvoke (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/fesm2015/zone-testing.js:287:1)
at _ZoneDelegate.invoke (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/fesm2015/zone.js:371:1)
at Zone.run (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/fesm2015/zone.js:134:1)
at runInTestZone (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/fesm2015/zone-testing.js:564:1)
at UserContext.<anonymous> (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/fesm2015/zone-testing.js:580:1)
at <Jasmine>
首先,TestBed 配置在您的示例中完全没有用。删掉就行了。
您的错误是因为您为 get
提供了模拟 return 值,但您的测试方法调用了 post
。因为间谍方法的默认 return 值是 undefined
它在 .pipe()
上爆炸并出现该错误。
服务
export interface ITransferRequest {
serviceName:string;
amount:number
}
@Injectable()
export class TransferService
{
transferMoneyUrl = 'https://localhost:44321/api/TransferService';
constructor(private http:HttpClient){}
doTransfer(transferRequest: ITransferRequest): Observable<TransferResult> {
return this.http.post<TransferResult>(this.transferMoneyUrl, transferRequest).pipe();
}
}
测试代码
describe('AppComponent', () => {
let transferService: TransferService,
mockHttp: any;
beforeEach(async () => {
mockHttp = jasmine.createSpyObj('mockHttp',['get', 'post']);
transferService = new TransferService(mockHttp);
await TestBed.configureTestingModule({
imports: [
RouterTestingModule
],
declarations: [
AppComponent
],
}).compileComponents();
});
it('should do transfer', done => {
const transferRequest: ITransferRequest = { serviceName: "A", amount: 1000 };
mockHttp.get.and.returnValue(of(<TransferResult>{ result : 600 }));
transferService.doTransfer(<ITransferRequest>transferRequest)
.subscribe((x: TransferResult) => {
expect(x.result).toBe(600);
done();
});
});
错误
TypeError: Cannot read properties of undefined (reading 'pipe')
at TransferService.doTransfer (http://localhost:9876/_karma_webpack_/webpack:/src/app/services/transfer.service.ts:32:86)
at UserContext.<anonymous> (http://localhost:9876/_karma_webpack_/webpack:/src/app/app.component.spec.ts:35:21)
at _ZoneDelegate.invoke (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/fesm2015/zone.js:372:1)
at ProxyZoneSpec.onInvoke (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/fesm2015/zone-testing.js:287:1)
at _ZoneDelegate.invoke (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/fesm2015/zone.js:371:1)
at Zone.run (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/fesm2015/zone.js:134:1)
at runInTestZone (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/fesm2015/zone-testing.js:564:1)
at UserContext.<anonymous> (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/fesm2015/zone-testing.js:580:1)
at <Jasmine>
首先,TestBed 配置在您的示例中完全没有用。删掉就行了。
您的错误是因为您为 get
提供了模拟 return 值,但您的测试方法调用了 post
。因为间谍方法的默认 return 值是 undefined
它在 .pipe()
上爆炸并出现该错误。