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

从CRA+Jest迁移到Vite+Vitest时mock window.URL报错求助

解决Vitest中mock window.URL.createObjectURL导致的文件加载错误

问题根源

你mock window.URL.createObjectURL 时返回的字符串 "URL" 被Vite的资源解析机制误判为本地文件路径,导致测试环境尝试加载不存在的C:/code/project/URL文件,从而抛出错误。

解决方案

1. 修改mock返回值为完整HTTP URL

将mock的返回值从单纯的"URL"改为不会被解析为本地路径的完整HTTP地址,避免触发Vite的本地文件查找逻辑:

if (!window.URL?.createObjectURL) {
    if (!window.URL) {
        // eslint-disable-next-line @typescript-eslint/ban-ts-comment
        // @ts-ignore
        window.URL = {};
    }

    window.URL.createObjectURL = vi.fn().mockImplementation(() => {
        return "https://example.com/mock-blob-url"; // 用完整HTTP URL替代纯字符串
    });
}

2. 优化全局mock写法(更简洁规范)

推荐在Vitest的全局setup文件中统一配置mock,避免在每个测试文件重复编写:

  • 创建vitest.setup.js文件:
// 保留原有window.URL的其他方法,仅覆盖需要mock的createObjectURL
vi.stubGlobal('URL', {
  ...window.URL,
  createObjectURL: vi.fn(() => 'https://example.com/mock-blob-url'),
});
  • 在vitest.config.js中配置setup文件:
import { defineConfig } from 'vitest/config';

export default defineConfig({
  test: {
    setupFiles: ['./vitest.setup.js'],
    // 其他测试相关配置
  },
});

原理说明

Vite在处理资源引用时,会自动解析本地相对/绝对路径并尝试加载对应文件。当组件使用createObjectURL的返回值作为资源路径(比如图片src)时,单纯的"URL"会被识别为本地文件路径,触发不存在文件的加载错误。而完整的HTTP URL会被视为外部资源,不会触发本地文件解析流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 05:07:26