Jest - макет свойства и функции из момента времени

Я пытаюсь издеваться над собственностью tz и функция, использующая шутку, но я не знаю, чтобы издеваться над обеими вещами вместе:

Если запустить что-то вроде:

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

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

    }
  }
})

Я могу издеваться над атрибутом tz или инструкция moment(), Как я могу написать макет для покрытия этого кода?

const moment = require('moment-timezone')

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

Спасибо

1 ответ

Вы можете воспользоваться вторым параметром 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)
})

Обратите внимание, что ручное предоставление макета для каждого тестового файла может быть утомительным и повторяющимся, если макетируемый модуль имеет огромную поверхность API. Чтобы рассмотреть последний случай, вы можете рассмотреть возможность создания некоторых ручных макетов, чтобы сделать их многократно используемыми (т. Е. Используя __mocks__ директива) и дополнить ее, используя jest.genMockFromModule(),

В документации Jest есть некоторые указания по этому поводу.

Другие вопросы по тегам