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

Quasar Vitest:如何为开发/生产及测试环境配置i18n启动文件

解决Quasar + Vitest测试中i18n未初始化的问题

问题背景

Quasar官方推荐在启动文件中配置i18n,示例代码如下:

import { defineBoot } from '#q-app/wrappers'
import { createI18n } from 'vue-i18n'
import messages from 'src/i18n'

export default defineBoot(({ app }) => {
  const i18n = createI18n({
    locale: 'en-US',
    globalInjection: true,
    messages
  })

  // Set i18n instance on app
  app.use(i18n)
})

但使用Vitest进行单元测试时,Quasar的启动文件不会自动执行,导致i18n未初始化,Vue组件和普通JS类中使用i18n的代码都会测试失败,尝试installQuasarPlugin方案也未能解决问题。

解决方案

1. 抽离i18n初始化逻辑

把i18n的创建逻辑单独封装成独立文件,方便测试环境和生产环境复用:

// src/i18n/index.js
import { createI18n } from 'vue-i18n'
import messages from './messages' // 替换为你的语言包路径

export const createI18nInstance = () => {
  return createI18n({
    locale: 'en-US',
    globalInjection: true,
    messages
  })
}

// 原启动文件修改为:
import { defineBoot } from '#q-app/wrappers'
import { createI18nInstance } from 'src/i18n'

export default defineBoot(({ app }) => {
  const i18n = createI18nInstance()
  app.use(i18n)
})

2. 针对不同场景初始化i18n

Vue组件测试

在组件测试的setup阶段,手动创建并挂载i18n实例:

import { mount } from '@vue/test-utils'
import { createI18nInstance } from 'src/i18n'
import TargetComponent from './TargetComponent.vue'

describe('TargetComponent', () => {
  const i18n = createI18nInstance()

  it('渲染正常且i18n生效', () => {
    const wrapper = mount(TargetComponent, {
      global: {
        plugins: [i18n]
      }
    })
    // 编写你的测试逻辑
  })
})

普通JS类测试

如果JS类依赖全局$t方法,可在测试文件开头初始化i18n并挂载到全局;若类直接依赖i18n实例,可直接传入:

import { createI18nInstance } from 'src/i18n'
import TargetService from './TargetService'

// 初始化i18n并挂载全局$t
const i18n = createI18nInstance()
globalThis.$t = i18n.global.t

describe('TargetService', () => {
  it('使用i18n的方法运行正常', () => {
    const service = new TargetService()
    expect(service.getLocalizedContent()).toBe('预期的多语言文本')
  })
})

3. 全局统一配置(可选)

如果大部分测试都需要i18n,可以在Vitest全局setup文件中统一初始化:

// tests/setup.js
import { createI18nInstance } from '../src/i18n'
import { config } from '@vue/test-utils'

const i18n = createI18nInstance()
// 全局挂载$t方法
globalThis.$t = i18n.global.t
// 给Vue组件测试全局注册i18n插件
config.global.plugins.push(i18n)

配置完成后,测试环境中的i18n就能正常初始化,组件和JS类的测试均可正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 03:05:06