Из многих, многих тестовых файлов только один, кажется, зависает одновременно. Он больше не зависает, когда тестовый файл запускается отдельно, но он сделал бы это с 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 выше экспорта
Заранее спасибо.