2

我正在尝试使用 jest 来模拟时刻库的格式功能。我的测试文件中有以下代码。

app.spec.js

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

应用程序.js

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

它正在生成以下输出:

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

预期的输出应该是:

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

谁能帮我指出代码有什么问题?

谢谢。

4

3 回答 3

1

您调用的format不是moment,而是 的结果moment()

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

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

        return moment
    });

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

于 2019-08-27T12:23:07.270 回答
1

模拟“时刻时区”而不是“时刻修复它。

jest.mock('moment-timezone', () => {
    const moment = () => ({
        format: () => mockedTime
    });
    moment.tz = {
        setDefault: () => {}
    };
    moment.tz.setDefault('Asia/Singapore');
    return moment;
});
于 2019-08-28T07:18:07.723 回答
1

可用的答案不适用于我的情况。Date.now然而,正如这个答案所暗示的那样,模拟底层函数: https ://stackoverflow.com/a/61659370/6502003

Date.now = jest.fn(() => new Date('2020-05-13T12:33:37.000Z'));
于 2020-12-16T18:46:58.320 回答