Jest中toBeInstanceOf(Object)校验导出对象失败的原因咨询
问题:Jest中
toBeInstanceOf(Object)校验模块导出对象失败的原因 场景复现
通过import * as Foo from './foo'导入模块后,使用Jest的expect(Foo).toBeInstanceOf(Object)断言会失败,但改用typeof Foo === 'object'就能正常通过测试。
原失败测试代码:
import * as Foo from './foo'; describe('Foo', () => { test('should export an object', () => { expect(Foo).toBeInstanceOf(Object); }); });
修改后通过的测试代码:
import * as Foo from './foo'; describe('Foo', () => { test('should export an object', () => { expect(typeof Foo).toEqual('object'); }); });
环境信息:
$» npm ls jest 1 ↵ my-project@0.31.5 ├── jest@29.3.1 └─┬ ts-jest@29.0.3 └── jest@29.3.1 deduped
原因解析
- 模块命名空间对象的特殊性:
import * as Foo得到的是模块命名空间对象,这类对象是ES模块规范定义的特殊结构,并非由全局Object构造函数实例化而来,其原型链不指向Object.prototype,因此toBeInstanceOf(Object)会返回false。 - typeof的特性:按照ES规范,
typeof对模块命名空间对象会返回'object'——它本质是类对象结构,但不属于普通Object实例范畴。 - ts-jest的转译影响:你使用了ts-jest,TypeScript转译过程会对模块导出做包装,但核心问题还是ES模块本身的规范限制,并非测试框架的bug。
推荐的校验方式
除了typeof,还可以用Jest提供的宽松对象校验,或者直接断言预期导出属性存在:
// 宽松校验对象类型 expect(Foo).toEqual(expect.any(Object)); // 精准校验:断言预期导出的键存在 expect(Foo).toHaveProperty('targetExportKey');
内容的提问来源于stack exchange,提问作者Manu Artero
相关产品推荐
相关产品推荐

