javascript - 如何用 Jest 来模拟模块的某些部分?

标签 javascript reactjs unit-testing jestjs momentjs

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

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

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

"TypeError: Cannot read property 'weekdaysShort' of undefined"

我的代码有一行: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);
  • __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
        }
      }
    );
    

    关于javascript - 如何用 Jest 来模拟模块的某些部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59272534/

    相关文章:

    reactjs - 在 React.js 中为滚动事件添加事件监听器后未获取回调

    reactjs - 在创建 React 应用程序 Reactjs 应用程序中使用通用 Sdk 模块共享代码库

    nunit - Resharper 9.0 说 'No tests found in selected solution items.' 然而有超过 100 个测试

    javascript - node.js Date#getTime() 有什么作用?

    javascript - 仅从 span 获取值 (ASP.NET MVC)

    javascript - 如何在 JavaScript 中编写倒数计时器?

    javascript - 将命令行参数发送到 npm 脚本

    reactjs - 如何强制选项卡适应 Material UI 中的小空间?

    php - PHP中的单元测试数据存储

    silverlight - 使用 StatLight 和 TeamCity 自动化 silverlight 单元测试