模拟 Intl.NumberFormat 使 Jest Test 独立于当前文化

问题描述

我正在尝试为一个函数编写玩笑测试,该函数将一组数字写入剪贴板。重要的一点是,此功能应使用浏览器中的当前语言设置,即对于美国文化设置,我想要一个“。”作为十进制分隔符,对于德语设置,我想要一个“,”。因此,我在内部使用“.toLocaleString()”。

现在使用 Node v14 运行我的测试,看起来 node 正在使用它运行的机器的文化设置。我们来看一个简化版:

const convertNumber = (value: number) => {
  return value.toLocaleString();
};

describe("Convert numbers using toLocaleString",() => {
  it("can respect decimal seperator",() => {
    const value = 3.14;
    expect(convertNumber(value)).toBe("3.14");
  });
});

在具有美国文化设置的 Windows 机器上运行该测试成功,在具有德国文化设置的机器上运行该测试失败,因为它将数字转换为“3,14”(因此,完整的 icu 就在那里正确转换为德语格式)。

我认为应该有人可以告诉节点使用哪种语言设置而不是使用机器设置。理想情况下,我想定义一个使用美国文化设置的测试和一个使用德国设置的测试,以确保该方法可以处理这两个版本。

到目前为止,我还坚持在测试中使用“.toLocaleString()”来检查返回值(至少确保我可以在任何机器上运行测试)

expect(convertNumber(value)).toBe(value.toLocaleString());

但我更愿意针对硬编码字符串进行测试以检查转换是否正确发生。我认为应该可以以某种方式模拟/定义 Intl.NumberSettings 对象以使用特定的文化,但我似乎无法弄清楚如何。

不胜感激任何输入。

编辑:关于@k0pernikus 的评论: 我正在使用“react-scripts test”(使用 create-react-app v3.4.3 创建)运行 jest。我尝试使用您提到的环境变量进行实验:

    const environmentvariableLang = env.LANG || env.LANGUAGE || env.LC_ALL || env.LC_MESSAGES;
    const navigatorLang = navigator.language;
    const actualLocale = Intl.DateTimeFormat().resolvedOptions().locale;

结果是 environmentvariableLange = 'en_US.UTF-8'(来自 env.LANG,其他未定义),navigatorLang = 'en-US' 但实际的语言环境仍然解析为 'de-DE'。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...