我有一个需要模拟的第三方模块(moment.js)。我想在需要测试的文件之前将实现设置为默认实现。我要模拟的唯一功能是模块的默认导出,因此我也将原型和静态成员分配给实际实现的成员。
season.js
import moment from 'moment';
export var currentSeason = getCurrentSeason();
export function currentSeasion() {
const diff = moment().diff(/* ... */);
// ...
return /* a number */;
}
__ tests __ / season.js
import moment from 'moment';
jest.mock('moment');
const actualMoment = jest.requireActual('moment');
moment.mockImplementation((...args) => actualMoment(...args));
Object.assign(moment, actualMoment);
const { getCurrentSeason } = require('../season');
test('getCurrentSeason()', () => {
moment.mockReturnValue(actualMoment(/* ... */));
expect(getCurrentSeason()).toBe(1);
});
我通过调试确认mockImpelementation()
被正确调用,并且在测试中也被正确调用。但是,在currentSeason
的初始化中,moment()
返回的是undefined。当我进入moment()
模拟函数时,mockConfig.mockImpl
是undefined
。
在测试文件中运行expect(moment()).toBeUndefined()
,但在导入season.js之前的任何测试之外,也会运行模拟实现。
我无法终生弄清楚为什么它仅在currentSeason
的初始化中不起作用。
答案 0 :(得分:0)
我不知道这对其他人有多大用处,但是我的解决方案却是将模拟代码放入自己的/__mocks__/moment.js
文件中。
const actual = jest.requireActual('moment'),
moment = jest.fn((...args) => actual(...args));
export default Object.assign(moment, actual);