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

Nuxt集成Jest测试框架时遇TypeError问题求助

问题描述

在Nuxt项目中接入Jest测试框架,测试简单组件时触发报错:

TypeError: Cannot destructure property 'createComponentInstance' of 'Vue.ssrUtils' as it is undefined

相关配置与测试代码如下:

测试用例文件

import { mount } from '@vue/test-utils'
import test from '../pages/test.vue'
describe('test', () => {
  test('is a Vue instance', () => {
    const wrapper = mount(test)
    expect(wrapper.vm).toBeTruthy()
  })
})

package.json配置

{
  "name": "test",
  "version": "1.0.0",
  "description": "test",
  "private": true,
  "scripts": {
    "dev": "nuxt",
    "build": "nuxt build",
    "start": "nuxt start",
    "test": "jest -u - runInBand - coverage - passWithNoTests"
  },
  "config": {
    "nuxt": {
      "host": "0.0.0.0"
    }
  }
}

Jest配置文件

module.exports={
  moduleNameMapper: {
    '^@/(.*)$': '<rootDir>/components',
    '^~/(.*)$': '<rootDir>/pages',
    '^vue$': 'vue/dist/vue.common.js'
  },
  moduleFileExtensions: [
    'js',
    'vue',
    'json'
  ],
  transform: {
    '^.+\\.js$': 'babel-jest',
    "^.+\\.js$": "babel-jest",
    ".*\\.(vue)$": 'vue-jest',
    '.*\\.(vue)$': 'vue-jest'
  },
  testEnvironment: "jest-environment-jsdom",
  collectCoverage: true,
  collectCoverageFrom: [
    '<rootDir>/components/**/*.vue',
    '<rootDir>/pages/**/*.vue',
    '<rootDir>/pages/**/*.js'
  ]
}
解决方案

这个报错大多是测试依赖版本不兼容、Nuxt SSR环境未正确模拟导致的,按以下步骤修复:

1. 统一测试依赖版本

如果你的项目是Nuxt 2(基于Vue 2),必须对应使用兼容版本的测试工具,卸载现有依赖后重装:

npm uninstall @vue/test-utils vue-jest babel-jest
npm install -D @vue/test-utils@1.3.0 vue-jest@4.0.1 babel-jest@26.6.3

2. 修正Jest配置

删除重复的transform规则,调整路径映射符合Nuxt默认逻辑,同时更新测试环境配置:

module.exports={
  moduleNameMapper: {
    '^@/(.*)$': '<rootDir>/$1',
    '^~/(.*)$': '<rootDir>/$1',
    '^vue$': 'vue/dist/vue.common.js'
  },
  moduleFileExtensions: ['js', 'vue', 'json'],
  transform: {
    '^.+\\.js$': 'babel-jest',
    '.*\\.(vue)$': 'vue-jest'
  },
  testEnvironment: "jsdom", // 新版jest中jest-environment-jsdom已简化为jsdom
  collectCoverage: true,
  collectCoverageFrom: [
    '<rootDir>/components/**/*.vue',
    '<rootDir>/pages/**/*.vue',
    '<rootDir>/pages/**/*.js'
  ],
  setupFilesAfterEnv: ['<rootDir>/jest.setup.js']
}

3. 添加Jest初始化文件模拟Nuxt上下文

在项目根目录新建jest.setup.js,手动补全Vue.ssrUtils并模拟Nuxt全局变量:

import Vue from 'vue'

// 模拟Nuxt全局上下文
global.$nuxt = {
  $router: { push: jest.fn() },
  $route: { path: '/' }
}

// 修复Vue.ssrUtils未定义的问题
Vue.ssrUtils = Vue.ssrUtils || {
  createComponentInstance: jest.fn(() => ({})),
}

4. 修正测试命令

package.json中test命令存在多余空格,修改为:

"scripts": {
  // ...其他脚本
  "test": "jest -u --runInBand --coverage --passWithNoTests"
}

5. 适配Nuxt页面组件测试

Nuxt页面组件可能依赖框架上下文,改用shallowMount并传入模拟数据:

import { shallowMount } from '@vue/test-utils'
import test from '../pages/test.vue'

describe('test', () => {
  test('is a Vue instance', () => {
    const wrapper = shallowMount(test, {
      mocks: {
        $nuxt: { $route: { path: '/test' } }
      }
    })
    expect(wrapper.vm).toBeTruthy()
  })
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 12:23:11