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

Ionic/Angular单元测试模拟Storage报this.storage.ready不是函数怎么解决

问题原因
  • 错误使用useValue配置类类型的依赖:useValue会直接将传入的值作为注入实例,你当前传入的是StorageMock类构造函数本身,而非类的实例,因此注入到组件中的storage对象是构造函数,没有挂载ready等原型方法,才会报方法不存在的错误。
  • StorageMock的vals属性未初始化:默认值为undefined,后续调用get/set方法操作this.vals时会抛出类型错误。
修复方案

第一步:完善StorageMock实现

补充vals属性的初始化,同时修正ready方法的返回值类型匹配:

export class StorageMock {
  driver: string;
  // 初始化存储对象
  vals: Record<string, any> = {};

  constructor() {}

  clear() {
    return new Promise<void>((res) => res())
  }

  ready() {
    // 传入符合LocalForage类型的空对象即可,无实际业务逻辑可直接断言类型
    return new Promise<LocalForage>((res) => res({} as LocalForage))
  }

  get(key: string) {
    return new Promise((res) => res(this.vals[key]))
  }

  set(key: string, val: any) {
    return new Promise((res) => {
      this.vals[key] = val;
      res()
    })
  }

  remove(key: string) {
    return new Promise((res) => {
      delete this.vals[key];
      res()
    })
  }
}

第二步:修正测试模块的Provider配置

将useValue替换为useClass,Angular测试运行时会自动实例化StorageMock作为注入实例:

providers: [
  CheckInsProvider,
  WeighInsProvider,
  PurchasesService,
  TransactionsProvider,
  // 替换useValue为useClass
  {provide: Storage, useClass: StorageMock},
  {provide: GlobalsService, useValue: mockGlobalsService}
]

如果需要手动控制实例的创建,也可以保留useValue直接传入实例:
{provide: Storage, useValue: new StorageMock()}

内容的提问来源于stack exchange,提问作者Jeremy Thomas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:39:02