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

使用Storybook与Vitest时Mock模块抛出customEqualityTesters未定义异常

使用Vitest在Storybook中Mock模块时出现"Cannot read properties of undefined (reading 'customEqualityTesters')"错误

问题场景

我基于Vitest搭建了Storybook环境,尝试在Story文件中用Vitest的vi.mock来Mock模块,代码如下:

// my-nice-function.stories.tsx
import { vi } from "vitest";

vi.mock("../some-module", () => ({
  someFunction: vi.fn(),
}));

// 实际的Story代码...

运行Story时抛出错误:

Cannot read properties of undefined (reading 'customEqualityTesters')

栈追踪指向Vitest内部的getCustomEqualityTesters函数,该函数尝试读取globalThis[Symbol.for("$$jest-matchers-object")].customEqualityTesters,但全局对象中不存在这个Symbol对应的条目。

解决方案

这个问题是因为Storybook环境没有初始化Vitest依赖的Jest兼容全局匹配器对象,可通过以下步骤修复:

  • 创建Vitest初始化文件
    在.storybook目录下新建vitest-setup.ts文件,手动注入缺失的全局对象:
const JEST_MATCHERS_OBJECT = Symbol.for('$$jest-matchers-object');

if (!globalThis[JEST_MATCHERS_OBJECT]) {
  globalThis[JEST_MATCHERS_OBJECT] = {
    customEqualityTesters: [],
    expect: () => ({
      // 按需添加基础方法,避免后续其他匹配器相关错误
      toBe: () => true,
      toEqual: () => true
    })
  };
}
  • 在Storybook中引入初始化文件
    修改.storybook/main.ts(或.storybook/main.js),将初始化文件添加到预览配置中:
export default {
  // 其他已有配置...
  previewAnnotations: [
    require.resolve('./vitest-setup.ts'),
  ],
};
  • 验证效果
    重启Storybook服务,此时vi.mock即可正常工作,不会再抛出customEqualityTesters相关错误。

如果不需要严格依赖Vitest的Mock API,也可以改用Storybook官方的Mock方案,比如通过Vite的resolve.alias配置来Mock模块。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 23:48:17