内置Javascript函数的模拟结果

时间:2019-07-03 04:42:48

标签: javascript unit-testing jestjs

我正在为定义为的函数xyz编写测试:

export const socialShare = function( socialType ) {

    const url  = encodeURIComponent( document.URL );
    const text = encodeURIComponent( document.title );

    switch( socialType ) {
        case 'social-mail':
            return `mailto:example@email.com?subject=${text}&body=${text}\n${url}`;

        case 'social-facebook':
            return `//www.facebook.com/sharer/sharer.php?u=${url}&t=${text}`;

        case 'social-twitter':
            return `//twitter.com/share?text=${text}&url=${url}`;

        default:
            return '';
    }   
}

如何模拟encodeURIComponent( document.URL )的结果? 有没有一种我可以模拟encodeURIComponent()的方式,以便Jest可以使用该模拟代替真正的模拟?

1 个答案:

答案 0 :(得分:1)

您可以使用 encodeURIComponent 模拟 jest.fn 实施,如下所示:

test('Mock Encode URI component', () => {
    // Store original implementation
    const originalEncode = encodeURIComponent;

    const message = "test string ()@#$%^";
    encodeURIComponent = jest.fn(() => 'Mock Value');
    expect(yourFunction(message)).toBe('Mock Value');

    // Restore original implementation
    encodeURIComponent = originalEncode;
});

您所需的模拟替换功能将作为参数传递给 jest.fn ,并可用于使其返回所需的任何值。或者,您也可以使用 jest.spyOn ,它使您仅能够模拟一次(或保留原始实现并仅跟踪其调用次数)。

test('Mock Encode URI component with Spy', () => {
    const message = "test string ()@#$%^";
    const spy = jest.spyOn(global, 'encodeURIComponent').mockImplementationOnce(() => 'Mock Value');
    expect(yourFunction(message)).toBe('Mock Value');
    expect(yourFunction(message)).toBe('test%20string%20()%40%23%24%25%5E');
});

除了提供模拟实现之外,还可以仅模拟返回值,如下所示:

test('Mock Encode URI component with Spy and Return Value', () => {
    const message = "test string ()@#$%^";
    const spy = jest.spyOn(global, 'encodeURIComponent').mockReturnValueOnce('Mock Value');
    expect(yourFunction(message)).toBe('Mock Value');
});

您可以在此处了解更多信息:Jest Mock Functions