首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模拟DayJs的默认函数及其链式方法

模拟DayJs的默认函数及其链式方法
EN

Stack Overflow用户
提问于 2020-08-18 14:35:37
回答 3查看 3.7K关注 0票数 5

我试图用特定的日期和时间来模拟dayjs()默认函数,还想模拟它的嵌套方法,即utc()& .add()

这就是我迄今为止尝试过的:

abc.ts:

代码语言:javascript
复制
getEarliestDate() {
    const {
        minHour,
        maxHour
    } = operatingHours;
    const earliestDateTime = dayjs().add(sla + 1, 'minute');
    const earliestDateTimeUTC = earliestDateTime.utc();

    return dayjs().add(121, 'minute').format('YYYY-MM-DD HH:mm');
}

abc.test.ts:

代码语言:javascript
复制
import { abc } from '../../src/common/serviceFactory';
import dayjs from 'dayjs';

jest.mock('dayjs', () =>
  jest.fn((...args) => jest.requireActual('dayjs')(args.filter((arg) => arg).length > 0 ? args : '2020-08-12')),
);

jest.mock('dayjs', () => ({
  default: jest.requireActual('dayjs')(`2020-08-18 12:00:00`),
  extend: jest.fn(),
  utc: jest.fn((...args) => {
    const dayjs = jest.requireActual('dayjs');
    dayjs.extend(jest.requireActual('dayjs/plugin/utc'));

    return dayjs.utc(args.filter((arg) => arg).length > 0 ? args : '12:00:00').startOf('day');
  }),
  add: jest.requireActual('dayjs')(`2020-08-18 12:00:00`),
}));

describe('getEarliestDate Function', () => {
  it('should return earliest date response', () => {
    const earliestDate = abc.getEarliestDate();
    expect(earliestDate).toMatch(dayjs().add(121, 'minute').format('YYYY-MM-DD HH:mm'));
  });

但是得到这个:TypeError: dayjs_1.default is not a function

如有任何帮助/建议,我们将不胜感激。

EN

回答 3

Stack Overflow用户

发布于 2020-10-16 13:50:09

对于使用dayjs的基本操作,这段代码可以工作:

代码语言:javascript
复制
jest.mock('dayjs', () => jest.fn((...args) => jest.requireActual('dayjs')(args.filter((arg) => arg).length > 0 ? args : '2020-08-12')),);

什么时候'2020-08-12‘是你想要嘲笑的日期。

票数 4
EN

Stack Overflow用户

发布于 2020-12-31 17:49:45

MockDate对此非常有用,不需要大量的模拟代码。

https://www.npmjs.com/package/mockdate

代码语言:javascript
复制
import MockDate from 'mockdate'
import dayjs from 'dayjs'

MockDate.set('2000-11-22')
console.log(dayjs.format())

// >>> 2000-11-22T00:00:00Z

使用:MockDate.reset();测试后,请记住清除模拟

票数 3
EN

Stack Overflow用户

发布于 2020-08-18 15:44:37

我认为问题在于模拟模块的default函数应该是函数,而不是dayjs()返回的结果。然后,按以下方式进行尝试:

代码语言:javascript
复制
jest.mock('dayjs', () => ({
  default: jest.fn((...args) => {
    const yourDay = jest.requireActual('dayjs')(args.filter((arg) => arg).length > 0 ? args : '2020-08-11');
    // Mock add function
    yourDay.add = jest.fn(() => jest.requireActual('dayjs')(`2020-08-10 12:00:00`));
    // more mock
    return yourDay;
  })
}));

还移除另一个模拟,因为它将替换:

代码语言:javascript
复制
jest.mock('dayjs', () => ({
  default: jest.requireActual('dayjs')(`2020-08-18 12:00:00`),
  extend: jest.fn(),
  // ...
}));

另一个解决方案,您可以更改并保持您的第一个模拟保持不变:

代码语言:javascript
复制
jest.mock('dayjs', () =>
  jest.fn((...args) => jest.requireActual('dayjs')(args.filter((arg) => arg).length > 0 ? args : '2020-08-12')),
);

您要做的唯一一件事是在您的esModuleInterop中启用选项tsconfig.json,因为这个选项将自动为您添加default函数:

代码语言:javascript
复制
{
  "compilerOptions": {
    // ...
    "esModuleInterop": true,
  },
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63470910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档