您如何用玩笑方式仅模拟模块的某些部分?

问题描述 投票:5回答:1

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

我解决的第一个问题是测试运行时日期将如何更改,因此我能够使用this guidance锁定当前时间。

当前,我陷入了错误:

“ TypeError:无法读取未定义的属性'weekdaysShort']”>

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

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

我的迫切问题

是如何设置玩笑以让我返回从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-不起作用,因为我没有在监视模块。
  3. [此时,我正在考虑放弃通过props传递的数组的Moment函数。尽管我有信心可以解决这个问题,但感觉之后我很快就会遇到另一个障碍。

    提前感谢您的帮助。

我已经围绕moment.js建立了一个日历,并且现在正在进行单元测试。我解决的第一个问题是测试运行时日期将如何更改,因此我能够锁定这一时刻...

javascript reactjs unit-testing jestjs momentjs
1个回答
4
投票

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

jest.mock('moment', () => 
  const original = jest.requireActual('moment');
  return {
    __esModule: true,
    default: {
       ...original,
       ...just the parts you want to mock
    }
  }
);
热门问题
推荐问题
最新问题