Jest - 从时刻时区模拟属性和函数

4 javascript jestjs

我正在尝试tz使用 jest来模拟属性和函数,但我不知道将这两个东西一起模拟:

如果运行类似:

jest.mock('moment-timezone', () => () => ({weekday: () => 5}))

jest.mock('moment-timezone', () => {
  return {
    tz: {

    }
  }
})
Run Code Online (Sandbox Code Playgroud)

我可以模拟属性tz或指令moment()。我怎样才能写一个模拟来覆盖这个代码?

const moment = require('moment-timezone')

module.exports.send = () => {
  const now = moment()
  moment.tz.setDefault('America/Sao_Paulo')
  return now.weekday()
}
Run Code Online (Sandbox Code Playgroud)

谢谢

miq*_*iqh 5

您可以利用 的第二个参数jest.mock(),它可以让您指定要在测试中使用的模拟模块的自定义实现。

在这个自定义实现中,您还可以定义一些方便的助手来模拟预期的实现值(例如weekday())。

// send-module.test.js

jest.mock('moment-timezone', () => {
    let weekday
    const moment = jest.fn(() => {
        return {
            weekday: jest.fn(() => weekday),
        }
    })
    moment.tz = {
        setDefault: jest.fn(),
    }
    // Helper for tests to set expected weekday value
    moment.__setWeekday = (value) => weekday = value
    return moment;
})

const sendModule = require('./send-module')

test('test', () => {
    require('moment-timezone').__setWeekday(3)
    expect(sendModule.send()).toBe(3)
})
Run Code Online (Sandbox Code Playgroud)

请注意,如果被模拟的模块具有巨大的 API 表面,则手动为每个测试文件提供模拟可能会变得乏味和重复。为了解决后一种情况,您可以考虑编写一些手动模拟以使其可重用(即使用__mocks__目录约定)并通过使用jest.genMockFromModule().

Jest 文档对此有一些指导。