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

Vue3+TypeScript项目Vitest测试含vue-i18n组件报错:_ctx.$t不是函数

解决Vue3+TypeScript项目中Vitest测试i18n组件时$t is not a function的错误

这个错误的核心原因是测试环境未将vue-i18n实例注入组件上下文,导致组件无法访问$t翻译方法,以下是三种针对性解决方案:

方案1:复用项目全局i18n配置

如果你的项目已在入口文件(如main.ts)全局注册了i18n,直接在测试文件中导入全局实例并注入组件:

假设你的i18n实例定义在src/i18n/index.ts:

// src/i18n/index.ts
import { createI18n } from 'vue-i18n'
import zhCN from './locales/zh-CN.json'
import enUS from './locales/en-US.json'

export default createI18n({
  locale: 'zh-CN',
  messages: { 'zh-CN': zhCN, 'en-US': enUS }
})

测试文件中使用:

import { mount } from '@vue/test-utils'
import AppLoader from '@/components/loader/AppLoader.vue'
import i18n from '@/i18n'

test('渲染空状态文本', () => {
  const wrapper = mount(AppLoader, {
    global: {
      plugins: [i18n] // 注入全局i18n插件
    },
    props: { isEmpty: true }
  })

  expect(wrapper.text()).toContain('暂无数据') // 对应你的message.empty翻译值
})

方案2:创建测试专用i18n实例

不想依赖全局配置时,可在测试文件中临时创建极简i18n实例,仅提供当前测试需要的翻译键:

import { mount } from '@vue/test-utils'
import { createI18n } from 'vue-i18n'
import AppLoader from '@/components/loader/AppLoader.vue'

// 测试用i18n实例,只包含当前组件需要的翻译
const testI18n = createI18n({
  locale: 'zh-CN',
  messages: {
    'zh-CN': { message: { empty: '暂无数据' } }
  }
})

test('渲染空状态文本', () => {
  const wrapper = mount(AppLoader, {
    global: { plugins: [testI18n] },
    props: { isEmpty: true }
  })

  expect(wrapper.text()).toContain('暂无数据')
})

方案3:Mock $t方法跳过翻译逻辑

若仅测试组件逻辑、不关心翻译内容,直接mock$t方法即可:

import { mount } from '@vue/test-utils'
import AppLoader from '@/components/loader/AppLoader.vue'

test('渲染空状态文本', () => {
  const wrapper = mount(AppLoader, {
    global: {
      mocks: {
        $t: (key: string) => key // 直接返回键名,或自定义固定文本
      }
    },
    props: { isEmpty: true }
  })

  expect(wrapper.text()).toContain('message.empty')
})

TypeScript类型修复

如果测试时出现$t类型不存在的报错,在src/vite-env.d.ts中补充类型声明:

/// <reference types="vue-i18n" />

declare module '@vue/runtime-core' {
  interface ComponentCustomProperties {
    $t: typeof import('vue-i18n').useI18n['t']
  }
}

export {}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 23:25:17