Jest:创建一个通用mock,在那里我可以传递自定义数据



我在所有成功运行的单独测试用例文件中都使用了以下内容。

jest.mock('next-i18next', () => {
return {
useTranslation: () => {
return {
t: (key) => {
const translations = {
title: 'May I help?',
showErrors: 'Something went wrong.',
noResultFound: `Oops`,
};
return translations[key];
},
};
},
};
});

翻译会根据不同的测试用例而变化,因此我在需要的地方都复制了它们。但我想修改它,使这个mock成为通用的(可能是通过创建一个函数(,它位于一个地方,而我从我需要的所有测试用例文件中调用这个创建的函数,并将我的自定义字典传递给它

const mockTranslations = (mockdictionary) => ({
jest.mock('next-i18next', () => {
return {
useTranslation: () => {
return {
t: (key) => {
return mockdictionary[key];
},
};
},
};
})
})

我不确定是否有可能在Jest做这件事,仍在努力弄清楚。我们将非常感谢在这里提供的任何帮助或其他方法。

我建议两种策略:

  • 修改mock,所以t函数总是返回翻译密钥(基本上是t: (key) => key(。在测试中,请检查DOM中是否存在正确的翻译密钥(expect(getByText("myTranslationKey")).toBeTruthy()(。因此,您可以验证是否使用了正确的密钥,但不能验证相应的文本是否正确
  • 不要在测试中嘲笑react-i18next,甚至更好:(。更现实,更有信心。如果动态加载JSON文件,则需要为Jest测试修改react-i18next配置。在Jest配置文件中,添加:
// assuming that you have multiple JSON files in /public/locales/en
import * as namespaces from '/public/locales/en';
i18next.use(initReactI18next).init({
[...]
lng: 'en',
resources: { en: namespaces },
});

所以现在你可以在Jest套件中测试你的真实文本了。

相关内容

最新更新