You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 19:31:35