开玩笑的模拟实现未在测试函数外部调用

时间:2019-09-16 19:29:58

标签: javascript unit-testing jestjs

我有一个需要模拟的第三方模块(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.mockImplundefined

在测试文件中运行expect(moment()).toBeUndefined(),但在导入season.js之前的任何测试之外,也会运行模拟实现。

我无法终生弄清楚为什么它仅在currentSeason的初始化中不起作用。

1 个答案:

答案 0 :(得分:0)

我不知道这对其他人有多大用处,但是我的解决方案却是将模拟代码放入自己的/__mocks__/moment.js文件中。

const actual = jest.requireActual('moment'),
    moment = jest.fn((...args) => actual(...args));

export default Object.assign(moment, actual);