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

Ionic Promise函数单元测试报错TS2304:找不到'done'名称

解决Jasmine+TypeScript单元测试中done()的TS2304错误

嘿,我来帮你搞定这个TS2304: Cannot find name 'done'的问题!这个错误其实是两个小问题叠加导致的:TypeScript认不出done的类型,同时你的测试函数也没正确接收这个回调参数。咱们一步步来修复:

一、核心问题拆解

在Jasmine的异步测试里,done是用来告诉测试框架“异步操作已经完成,可以断言结果了”的回调函数,但你得先把它作为参数传给测试函数,同时TypeScript需要Jasmine的类型定义文件才能识别它。

二、具体修复步骤

1. 安装Jasmine的TypeScript类型定义

首先,你需要安装@types/jasmine这个包,它会给TypeScript提供Jasmine所有API的类型信息,包括done:

npm install @types/jasmine --save-dev

2. 给测试函数添加done参数

你的测试代码里没把done作为参数声明,TypeScript自然找不到它。把测试函数改成这样:

it('should have correct values after loading data', function(done) {
  comp.storage.set(comp.fooKey, JSON.stringify(0.1234));
  comp.storage.get(comp.fooKey).then(result => {
    expect(JSON.parse(result)).toEqual(0.1234);
    done(); // 现在TypeScript能识别这个函数了
  });
});

如果你喜欢用箭头函数,也可以写成:

it('should have correct values after loading data', (done) => {
  comp.storage.set(comp.fooKey, JSON.stringify(0.1234));
  comp.storage.get(comp.fooKey).then(result => {
    expect(JSON.parse(result)).toEqual(0.1234);
    done();
  });
});

3. 修正tsconfig.json的配置

你之前把**/*.spec.ts加到excludes里是错的!TypeScript需要编译你的测试文件才能做类型检查,所以得把测试文件从排除列表里删掉,或者加到includes里:

{
  "compilerOptions": {
    "target": "ES6", // ES6及以上版本都可以
    "module": "CommonJS",
    "types": ["jasmine"] // 确保这里包含jasmine类型
  },
  "include": [
    "src/**/*.ts",
    "src/**/*.spec.ts" // 把测试文件包含进来
  ],
  "exclude": [
    "node_modules"
  ]
}

三、顺便帮你修复StorageMock的小问题

看了你的StorageMock代码,发现set方法的实现有问题:你用数组push键值对,但get方法却是用this.internal[key]取值,这会导致永远拿不到正确的值。应该把internal改成对象类型:

export class StorageMock {
  private internal: {[key: string]: any} = {}; // 改成对象存储键值对
  public driver(): any { return ''; }
  public ready(): Promise<any> {
    return new Promise(resolve => resolve({}));
  }
  public get(key: string): Promise<any> {
    const getval = this.internal[key];
    return new Promise(resolve => resolve(getval));
  }
  public set(key: string, value: any): Promise<any> {
    this.internal[key] = value; // 直接给对象的key赋值
    return new Promise(resolve => resolve());
  }
  // 对应的remove和keys方法也调整一下
  public remove(key: string): Promise<any> {
    delete this.internal[key];
    return new Promise(resolve => resolve());
  }
  public keys(): Promise<any> {
    const keys = Object.keys(this.internal);
    return new Promise(resolve => resolve(keys));
  }
  // 其他方法可以保持原样或者按需调整
}

这样你的测试才能正确获取到设置的值,不会因为Mock的问题导致测试失败。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:36:47