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

如何在Jest单元测试中调用异步立即执行匿名函数(IIFE)

解决方法

你的问题核心是这个异步IIFE是立即执行且没有对外暴露的,所以外部代码(不管是Jest测试还是其他TS文件)没法直接手动调用它。下面两种方法可以解决这个问题:

方法一:修改原文件,把函数导出(推荐)

把原来的立即执行逻辑拆成函数定义+导出,同时保留原本的自动执行行为(如果需要的话):

// index.ts
// 把逻辑封装成命名函数并导出
export const runTodoListLogic = async () => {
  // 这里写你的todo list业务逻辑
};

// 保留原来的立即执行行为,不影响原有功能
runTodoListLogic();

这样不管是Jest测试还是其他TS代码,都能轻松调用:

Jest测试用例示例

// index.test.ts
import { runTodoListLogic } from './index';

test('测试todo列表逻辑', async () => {
  // 手动调用函数,还能获取返回值
  const result = await runTodoListLogic();
  // 这里添加断言,比如检查结果是否符合预期
});

TypeScript代码调用示例

// 其他TS文件
import { runTodoListLogic } from './index';

async function doSomething() {
  await runTodoListLogic();
  // 执行后续逻辑
}

方法二:不修改原文件,通过导入模块触发执行

如果没办法修改原代码,那只要导入这个模块,里面的IIFE就会自动执行。但这种方式没法手动控制调用时机,也拿不到函数返回值:

Jest测试中触发执行

// index.test.ts
test('触发todo逻辑执行', async () => {
  // 导入模块的瞬间,IIFE就会运行
  await import('./index');
  // 这里可以添加针对执行结果的断言,比如检查某个全局状态、存储内容等
});

如果需要重复执行,得先清除Jest的模块缓存:

test('重复触发todo逻辑', async () => {
  // 重置模块缓存,避免重复导入时不执行
  jest.resetModules();
  await import('./index');
  
  // 第二次执行
  jest.resetModules();
  await import('./index');
});

注意点

  • 如果你需要控制调用时机、获取返回值、重复测试逻辑,优先用方法一,这是更规范的代码组织方式。
  • 方法二属于权宜之计,只适合不能修改原代码的场景,灵活性很低,很难做精细化测试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 10:05:22