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

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

原因解析

  1. 模块命名空间对象的特殊性:import * as Foo得到的是模块命名空间对象,这类对象是ES模块规范定义的特殊结构,并非由全局Object构造函数实例化而来,其原型链不指向Object.prototype,因此toBeInstanceOf(Object)会返回false。
  2. typeof的特性:按照ES规范,typeof对模块命名空间对象会返回'object'——它本质是类对象结构,但不属于普通Object实例范畴。
  3. ts-jest的转译影响:你使用了ts-jest,TypeScript转译过程会对模块导出做包装,但核心问题还是ES模块本身的规范限制,并非测试框架的bug。

推荐的校验方式

除了typeof,还可以用Jest提供的宽松对象校验,或者直接断言预期导出属性存在:

// 宽松校验对象类型
expect(Foo).toEqual(expect.any(Object));

// 精准校验:断言预期导出的键存在
expect(Foo).toHaveProperty('targetExportKey');

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 14:24:29