【问题标题】:How do you mock just certain parts of a module with jest?你如何用 jest 模拟模块的某些部分?
【发布时间】:2019-12-10 17:25:09
【问题描述】:

我已经围绕moment.js 构建了一个日历,并且我现在正在进行单元测试。

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

目前,我遇到了一个错误:

“TypeError: 无法读取未定义的属性‘weekdaysShort’”

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

通过实现模拟的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);
  1. __mocks__ 文件夹中组装手动模拟。我并没有在这条路上走得太远,因为它开始觉得我必须将整个 Moment.js 库复制/粘贴到模拟中。虽然弄清楚他们是如何做的会很酷,但这是另一天的项目。
  2. jest.spyOn - 不起作用,因为我没有监视模块。

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

提前感谢您的帮助。

【问题讨论】:

标签: javascript reactjs unit-testing jestjs momentjs


【解决方案1】:

刚刚发现我常用的模式是在 2016 github thread 中提供的,老实说,即使我不记得了,我也可能是从那里找到它的 :)

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

【讨论】:

    【解决方案2】:

    MomentJS 和 Jest 不能很好地配合使用。 requireActual 方法会很棒,但即使提供以下内容也会产生一个不会渲染的组件。

    jest.mock('moment', () => 
      const original = jest.requireActual('moment');
      return {
        __esModule: true,
        default: {
           ...original,
        }
      }
    );
    

    最终,我能够通过模拟 Javascript Date 对象将日期锁定到一个时刻,MomentJS 在该对象上构建了所​​有这些功能。

    describe('Calendar', () => {
      let dateNowSpy;
    
      beforeAll(() => {
        dateNowSpy = jest.spyOn(Date, 'now').mockImplementation(() => 1487076708000);
      });
    
      afterAll(() => {
        dateNowSpy.mockRestore();
      });
    
      it('does things, () => {
        // all the things!
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-08-15
      • 2021-09-07
      • 2018-01-18
      • 2018-01-26
      • 2019-08-17
      • 1970-01-01
      • 2021-07-06
      • 2021-02-04
      相关资源
      最近更新 更多