我正在尝试使用jest模拟属性tz和一个函数,但我不知道如何同时模拟这两个东西:
如果运行如下命令:
jest.mock('moment-timezone', () => () => ({weekday: () => 5}))
jest.mock('moment-timezone', () => {
return {
tz: {
}
}
})我可以模拟属性tz或指令moment()。我如何写一个mock来覆盖这段代码呢?
const moment = require('moment-timezone')
module.exports.send = () => {
const now = moment()
moment.tz.setDefault('America/Sao_Paulo')
return now.weekday()
}谢谢
发布于 2018-10-20 07:29:54
您可以利用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()进行补充。
https://stackoverflow.com/questions/52900076
复制相似问题