Некоторые юнит-тесты зависают навсегда после добавления с помощью HameNamespaces, реагирует с i18next v9 (обновлено с 3) - PullRequest
0 голосов
/ 23 декабря 2019

Из многих, многих тестовых файлов только один, кажется, зависает одновременно. Он больше не зависает, когда тестовый файл запускается отдельно, но он сделал бы это с toMatchSnapshot() тестами. Я решил эту проблему, передав макет функции i18next t компоненту.

И каждый раз, когда я запускаю npm test для всех наборов тестов, тест, который зависает, может меняться. Если я попытаюсь сузить неудачный тест с помощью test.only или запустить для отдельного файла, то тест будет пройден.

i18n config:

import path from 'path'
import { LanguageDetector } from 'i18next-express-middleware'
import FsBackend from 'i18next-node-fs-backend'
import i18n from 'i18next'
import config from 'config'
import { reactI18nextModule } from 'react-i18next'

i18n.use(FsBackend)
  .use(LanguageDetector)
  .use(reactI18nextModule)

export const options = {
  debug: false,
  fallbackLng: 'en',
  ns: ['common', 'contact', 'faq', 'nav', 'page', 'tabs'],
  backend: {
    loadPath: path.join(config.localesPath, '{{lng}}/{{ns}}.json')
  },
  resources: window.__PRELOADED_LOCALES__,
  detection: {
    order: ['querystring', 'cookie', 'header', 'navigator'],
    lookupCookie: 'locale'
  },
  interpolation: {
    escapeValue: false
  },
  react: {
    wait: true
  }
}

export default { i18n, options }

Приведенный ниже тест работает только иногда, но достаточно запустить npm test, и это может быть тот, который не удался, обычно только один зависает в конце. Возможно, состояние гонки i18n.init (), поэтому я попытался перенести его в файл beforeAll / Each в тестовых файлах, используя async done(). Это помогло многим файлам получить доступ к переводам. Должен быть другой способ сделать это, поскольку я не видел этого ни в одном из примеров в Интернете или в документации.

import React from 'react'
import { mount } from 'enzyme'
import { Provider } from 'react-redux'
import { MockedProvider } from 'react-apollo/test-utils'
import toJson from 'enzyme-to-json'
import { createStore } from 'test/helpers'
import Seller from '.'
import { I18nextProvider } from 'react-i18next'
import mocki18next from 'test/helpers/createI18n'

let store = createStore({
  itineraryDetails: { token: '123abc' }
})

describe('XSell', () => {
  beforeAll(done => {
    mocki18next.i18n.init(mocki18next.options).then(() => {
      done()
    })
  })

  test('renders', () => {
    const wrapper = mount(
      <Provider store={store}>
        <MockedProvider mocks={mocks} addTypename={false}>
          <ThemeProvider>
            <ExperimentContext.Provider>
              <Seller />
            </ExperimentContext.Provider>
          </ThemeProvider>
        </MockedProvider>
      </Provider>
    )
    expect(toJson(wrapper)).toMatchSnapshot()
  })
})

Тесты для компонентов, которые даже не используют withNamespaces, также могут зависать бесконечно. В приведенном ниже примере компонента используется withNamespaces, но он зависает при монтировании или визуализации иногда в тестах:

import { withNamespaces } from 'react-i18next'

const Seller = props => {
  const { t } = props

  return (
    <RcAddon
      header={t('tabs:rcAddon.header')}
      banner={{text: t('rcxsell:rcAddon.bannerText')}
    />
  )
}

XSell.propTypes = {
  t: PropTypes.func,
}

export default withNamespaces('tabs')(Seller)

Возможно, что-то связано с моим тестовым конфигом i18n. Изначально я использовал init выше экспорта

Заранее спасибо.

...