使用jest moment()。format模拟返回当前日期,而不是模拟日期

时间:2019-08-27 12:09:54

标签: javascript unit-testing ecmascript-6 jestjs moment-timezone

我正在尝试使用开玩笑来模拟一下矩库的格式功能。我的测试文件中包含以下代码。

app.spec.js

jest.mock('moment', () => {
    const moment = () => ({
        format: () => mockedTime
    });
    moment.tz = {
        setDefault: () => {}
    };
    moment.tz.setDefault('Asia/Singapore');
    return moment;
});

app.js

moment.tz.setDefault(TIMEZONE);
moment().format('YYYYMMDD');

它正在生成以下输出:

 - "date": "20190825", // mocked date
 - "date": "20190827", // result value

预期输出应为:

 - "date": "20190825", // mocked date
 - "date": "20190825", // result value

有人可以帮助我指出代码有什么问题吗?

谢谢。

3 个答案:

答案 0 :(得分:1)

您不是在format上而是在moment的结果上呼叫moment()

    jest.doMock('moment', () => {
        const moment = () => ({
            format: () => mockedTime,
        })

        moment.tz = { // prevent 'Cannot read property of undefined'
            setDefault: () => {},
        }

        return moment
    });

这样可以吗,还是您需要在应用中进行更复杂的模拟,包括时区?

答案 1 :(得分:1)

模拟“ moment-timezone”,而不是“ moment fixed”。

jest.mock('moment-timezone', () => {
    const moment = () => ({
        format: () => mockedTime
    });
    moment.tz = {
        setDefault: () => {}
    };
    moment.tz.setDefault('Asia/Singapore');
    return moment;
});

答案 2 :(得分:0)

可用的答案不适用于我的情况。然而,模拟基本的Date.now函数是因为这个答案表明:https://stackoverflow.com/a/61659370/6502003

Date.now = jest.fn(() => new Date('2020-05-13T12:33:37.000Z'));