Angular服务测试问题:getLoyaltyRewards方法类型报错排查
Angular服务测试问题:user_offers未定义场景的类型错误
待测试的Angular服务方法
public async getLoyaltyRewards(): Promise<IReward[]> { return this.sessionmApi.getUserOffers().then((offer) => { if (!offer) { return []; } if (offer.user_offers) { offer.user_offers.forEach((u) => { u.barcode = this.state.getValue().appState.sessionmUser.id; }); } return offer.user_offers; }); }
已完成的测试用例(offer为undefined场景)
该测试运行正常:
fit('should return empty array when offer is undefined', (doneFn) => { const mockOffer = undefined // you have to set it undefined as variable // sessionmApi need to be passed correctly const spygetUserOffers = spyOn(service['sessionmApi'], 'getUserOffers').and.returnValue(Promise.resolve(mockOffer)); service.getLoyaltyRewards().then((data) => { expect(data).toBeInstanceOf(Array) expect(data).toEqual([]) expect(spygetUserOffers).toHaveBeenCalled() doneFn() }) });
遇到的问题:user_offers未定义场景测试报错
编写以下测试用例时:
fit('should return undefined if user_offers is not defined', (doneFn) => { const mockUserOffer = MockOffer.user_offers ; // you have to set it without the required property // sessionmApi need to be passed correctly const spygetUserOffers = spyOn(service['sessionmApi'], 'getUserOffers').and.returnValue(Promise.resolve(mockUserOffer)); service.getLoyaltyRewards().then((data) => { expect(data).toEqual(undefined) expect(spygetUserOffers).toHaveBeenCalled() doneFn() }) });
编辑器报错:
Argument of type 'Promise<UserOffer[]>' is not assignable to parameter of type 'Promise
'. Type 'UserOffer[]' is missing the following properties from type 'Offer'
疑惑点:认为传递的是正确的offer.user_offers,不清楚为何出现该类型错误,请求帮助。
解决方案
问题出在mock数据的类型不匹配:sessionmApi.getUserOffers()的返回类型是Promise<Offer>,但你现在传入的mockUserOffer是UserOffer[]类型,而非完整的Offer对象。
要模拟user_offers未定义的场景,你需要创建一个完整的Offer对象,但其中不包含user_offers属性,或者将其设为undefined:
fit('should return undefined if user_offers is not defined', (doneFn) => { // 创建一个不包含user_offers的Offer对象 const mockOffer: Offer = {}; // 或者显式设置user_offers为undefined:const mockOffer: Offer = { user_offers: undefined }; const spygetUserOffers = spyOn(service['sessionmApi'], 'getUserOffers').and.returnValue(Promise.resolve(mockOffer)); service.getLoyaltyRewards().then((data) => { expect(data).toBeUndefined(); expect(spygetUserOffers).toHaveBeenCalled(); doneFn(); }); });
这样就能保证mock数据的类型与getUserOffers()的返回类型一致,解决类型错误的问题。
内容的提问来源于stack exchange,提问作者Marcos Galaviz
相关产品推荐
相关产品推荐

