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

Nuxt3中Vitest测试含相对路径img标签组件报错排查

Nuxt3 + Vitest 中原生标签相对URL导致测试报错的解决办法

在Nuxt3项目中运行Vitest时,会触发如下错误:

TypeError: Cannot read properties of undefined (reading 'cdnURL')

问题根源是组件中使用了带相对URL的原生<img>标签(图片存放在public目录,本地运行正常),移除这类标签或替换为<NuxtImg>后测试可正常执行,但项目中存在大量这类图片,无法逐一修改,因此需要不改动现有<img>标签的解决思路。

报错场景的代码示例

被测组件代码:

<template>
    <div>
       <img src="/images/site-logo.svg" width="204" height="24" alt="site logo" />
       <h2 class="fw-bold mt-3">
          Welcome Back!
       </h2>
    </div>
</template>

Vitest配置文件:

// vitest.config.ts
import { defineVitestConfig } from "@nuxt/test-utils/config";

export default defineVitestConfig({
    test: {
        environment: "happy-dom",
        setupFiles: "vitest-setup.ts"
    }
});

可行的解决思路

1. 在测试setup中Mock Nuxt的运行时配置

在vitest-setup.ts中添加对useRuntimeConfig的Mock,确保cdnURL有定义:

// vitest-setup.ts
import { vi } from 'vitest';

vi.stubGlobal('useRuntimeConfig', () => ({
  public: {
    cdnURL: '/' // 设为public目录的根路径即可
  }
}));

2. 在测试环境禁用Nuxt的图片优化插件

修改nuxt.config.ts,在测试环境下跳过Nuxt对原生<img>标签的自动处理:

// nuxt.config.ts
export default defineNuxtConfig({
  // ...其他项目配置
  hooks: {
    'vite:extendConfig': (config, { isTest }) => {
      if (isTest) {
        // 过滤掉Nuxt图片处理插件,避免触发cdnURL相关逻辑
        config.plugins = config.plugins?.filter(plugin => 
          !plugin.name?.includes('nuxt:image')
        );
      }
    }
  }
});

3. 拦截HTMLImageElement的src赋值逻辑

在测试setup中重写HTMLImageElement的src属性,绕过Nuxt的处理逻辑:

// vitest-setup.ts
import { beforeEach } from 'vitest';

beforeEach(() => {
  const OriginalImg = globalThis.HTMLImageElement;
  globalThis.HTMLImageElement = class extends OriginalImg {
    set src(value) {
      // 直接赋值原生src,不经过Nuxt的转换处理
      super.src = value;
    }
  };
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 04:49:53