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 есть некоторые указания по этому поводу.