NodeJS 如何模拟dayj的链式方法

t2a7ltrp  于 2022-12-03  发布在  Node.js
关注(0)|答案(3)|浏览(121)

我有此日志对象:
const today = dayjs.utc(date).startOf("day")
我试着用笑话来嘲笑它,但无济于事。以下是我尝试过的方法:

jest.mock("dayjs", () => ({
  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 : mockDate)
      .startOf("day");
  }),
  startOf: jest.fn().mockReturnThis(),
}));

我也试过这个:

jest.mock("dayjs", () => ({
  extend: jest.fn(),
  utc: jest.fn((...args) => ({
    startOf: jest.fn(() => {
      const dayjs = jest.requireActual("dayjs");
      dayjs.extend(jest.requireActual("dayjs/plugin/utc"));

      return dayjs
        .utc(args.filter((arg) => arg).length > 0 ? args : mockEventData)
        .startOf("day");
    }),
  })),
}));

两者都不起作用。有人有什么建议吗?

ny6fqffe

ny6fqffe1#

MockDate在这方面工作得很好,不需要大量的模拟代码。
https://www.npmjs.com/package/mockdate

import MockDate from 'mockdate'
import dayjs from 'dayjs'
import utc from 'dayjs/plugin/utc'
dayjs.extend(utc)

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

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

请记得在测试后使用以下工具清除模拟:MockDate.reset();

biswetbf

biswetbf2#

假设您试图创建一个一致的输出,而不考虑给定的日期参数,您可以像这样创建Node Module mock:


然后在src文件夹内的测试中,dayjs.utc将始终使用模拟日期

src/today.spec.js

const today = require("./today");
const dayjs = require("dayjs");

describe("today", () => {
  let result;
  beforeAll(() => {
    result = today();
  });

  it("should be called with a date", () => {
    expect(dayjs.utc).toHaveBeenCalledWith(expect.any(Date));
  });

  it("should return consistent date", () => {
    expect(result).toMatchInlineSnapshot(`"1995-12-17T00:00:00.000Z"`);
  });
});

example on github

laik7k3q

laik7k3q3#

我使用插件customParseFormat,我只是这样嘲笑:

jest.mock('dayjs/plugin/customParseFormat', () => ({
  default: jest.requireActual('dayjs/plugin/customParseFormat'),
}));

对我有用。

相关问题