使用 next-translate 和 i18n 测试组件

Posted

技术标签:

【中文标题】使用 next-translate 和 i18n 测试组件【英文标题】:Testing components using next-translate and i18n 【发布时间】:2021-06-26 07:34:10 【问题描述】:

在我们的 Next.js 应用程序中,我们使用 vinissimus/next-translate 包进行翻译。 我们进行了相应的设置:

next.config.js

const nextTranslate = require('next-translate')
module.exports = nextTranslate()

i18n.js 配置文件


  "locales": ["en"],
  "defaultLocale": "en",
  "pages": 
    "*": ["en"],
    "/": ["en"],
  

通过 useTranslation 钩子在组件内使用它:

const App = () => 
  const  t, lang  = useTranslation();

  return (
    <Homepage>
          <span>t(`$lang:homepage.title.header`)</span>
    </Homepage>

我的问题是如何用 react-testing-library 开玩笑地测试它?

当我在测试中渲染我的组件时,翻译不起作用,只返回键。另外,我想通过 getByText / findByText 测试它并通过:

t(`$lang:homepage.header`)

如果我没有在应用程序中使用任何 i18nProvider 而只使用这个 i18n.js 配置,我该如何设置某种包装器或配置来进行测试? p>

【问题讨论】:

【参考方案1】:

这是一个示例包装器:

// tests/wrapper.js
import  render  from '@testing-library/react'
import I18nProvider from 'next-translate/I18nProvider'

import commonEN from '../locales/en/common.json'

const Providers = ( children ) => (
  <I18nProvider
    lang='en'
    namespaces=
      common: commonEN
    
  >
    children
  </I18nProvider>
)

const customRender = (ui, options = ) => render(ui,  wrapper: Providers, ...options )

export * from '@testing-library/react'

export  customRender as render 

测试看起来像

// App.spec.js
import React from 'react'
import  render  from './tests/wrapper'
import App from './App'

jest.mock('next/router', () => (
  useRouter() 
    return 
      asPath: '/'
    
  
))

describe('App', () => 
  it('should render the app', async () => 
    const res = render(<App />)
  )
)

【讨论】:

以上是关于使用 next-translate 和 i18n 测试组件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 spring-boot 和 thymeleaf 设置标准 i18n 语言环境?

使用 i18n 和 Nuxt 时设置语言属性?

如何使用 i18n 和 rails 配置语言环境别名?

PHP Drupal 6:使用i18n模块翻译主要和次要链接

玩I18N库

如何在运行时在表单生成器中使用 I18n 和 Json Schema?