你如何开玩笑地模拟模块的某些部分?

Mar*_*arc 5 javascript unit-testing momentjs reactjs jestjs

我已经建立了一个日历moment.js,我现在正在进行单元测试。

我解决的第一个问题是测试运行时日期将如何变化,因此我已经能够使用此指南锁定时刻。

目前,我陷入了一个错误:

“类型错误:无法读取未定义的属性‘weekdaysShort’”

我的代码有一行: const dateHeaders = moment.weekdaysShort();

通过实现 mocked moment().format(),我基本上失去了库的其余部分。

我的直接问题是如何设置 jest 让我返回您从中获得的数组moment.weekdaysShort();

我更大的问题是我是否走错了路,是否应该想出另一种策略。

我尝试过但结果不成功的事情

  1. weekdayShort函数中手动添加:
const mockMoment = function() {
  return {format: '2016–12–09T12:34:56+00:00'}
};

mockMoment['weekdaysShort'] = () => ['Sun', 'Mon', 'Tues']; // etc etc etc

jest.mock('moment', () => mockMoment);
Run Code Online (Sandbox Code Playgroud)
  1. __mocks__文件夹中组装手动模拟。我没有走得太远,因为我开始觉得我必须将整个 Moment.js 库复制/粘贴到模拟中。虽然弄清楚他们如何做他们所做的事情会很酷,但这是另一天的项目。
  2. jest.spyOn - 不起作用,因为我没有监视模块。

在这一点上,我正在考虑放弃Moment通过 props 传入的数组的函数。虽然我相信这会让我克服这个问题,但感觉之后我会很快遇到另一个障碍。

在此先感谢您的帮助。

Ada*_*dam 5

刚刚发现我常用的模式是在2016 年的 github 线程中提供的,老实说,这可能是我找到它的地方,尽管我没有特别记得它:)

jest.mock('moment', () => 
  const original = jest.requireActual('moment');
  return {
    __esModule: true,
    default: {
       ...original,
       ...just the parts you want to mock
    }
  }
);
Run Code Online (Sandbox Code Playgroud)