【问题标题】:Set the locale for `Date.prototype.toLocaleString` for Jest tests为 Jest 测试设置 `Date.prototype.toLocaleString` 的语言环境
【发布时间】:2020-06-26 12:22:15
【问题描述】:

我们在世界各地都有前端工程师,所以当我们运行Date.prototype.toLocaleString 时,我们会得到不同的结果。有时,这些差异会出现在 Jest 测试中。如果其他国家的某人运行 Jest 测试,它可能会因为 toLocaleString 而失败。有哪些方法可以强制 Jest 使用特定的语言环境?

作为创可贴解决方案,我在失败的测试中添加了以下内容:

  const toLocaleString = Date.prototype.toLocaleString;
  // eslint-disable-next-line no-extend-native
  Date.prototype.toLocaleString = function(locale = 'en-US', ...args) {
    return toLocaleString.call(this, locale, ...args);
  };

【问题讨论】:

  • 由于您只需要针对测试进行调整,因此最好在测试前更改系统区域设置。
  • 我认为这没问题。您已经在嘲笑日期本身。另一个常见的场景是模拟Date.now。所以我认为这毕竟不是一个“创可贴”的解决方案。

标签: javascript jestjs


【解决方案1】:

你应该下载完整的icu节点包:

npm i full-icu --save

然后像这样运行你的测试:

NODE_ICU_DATA=node_modules/full-icu jest

因此,如果您运行 npm 脚本,您的 package.json 将如下所示:

"scripts": {
   "dev": "...",
   "test": "NODE_ICU_DATA=node_modules/full-icu jest",
 },

如果使用 React 脚本:

"scripts": {
   "dev": "...",
   "test": "NODE_ICU_DATA=node_modules/full-icu react-scripts test",
 },

如果您使用的是 Jest VSCode 扩展,则必须更改此配置:

`"jest.pathToJest": "npm run test --"`

【讨论】:

  • 为什么它可以帮助我?
  • jest 运行的节点服务器没有完整的国际化能力。所以它没有正确格式化字符串,因为它没有找到节点中的语言环境来执行它。
  • 谢谢!清晰的解决方案,不需要任何代码更改(与引入 intl 包并完全失去本机 toLocaleString 调用相反)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 2013-06-14
  • 2013-01-10
相关资源
最近更新 更多