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