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

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

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



我的代码有一行:const dateHeaders = moment.weekdaysShort();
通过实现模拟的moment().format(),我基本上失去了该库的其余部分。

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

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

我尝试了失败的操作

  • 手动添加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);
    
  • __mocks__文件夹中组装手动模拟。我并没有走太远,因为它开始感觉像我不得不将整个Moment.js库复制/粘贴到模拟中。尽管弄清楚他们如何做自己的工作很酷,但这是另一天的项目。
  • jest.spyOn-不起作用,因为我没有在监视模块。

  • 在这一点上,我正在考虑放弃通过props传递的数组的Moment函数。虽然我有信心可以解决这个问题,但感觉之后我很快就会遇到另一个障碍。

    先谢谢您的帮助。

    最佳答案

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

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

    09-11 19:50
    查看更多