我正在为定义为的函数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可以使用该模拟代替真正的模拟?
答案 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