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
相关产品推荐
相关产品推荐

