Reactjs Jest mock window.scrollTo

Reactjs Jest mock window.scrollTo,reactjs,mocking,jestjs,jsdom,Reactjs,Mocking,Jestjs,Jsdom,我的React组件调用窗口。滚动到,当我运行jest测试时,它们通过了,但出现了控制台错误: console.error node_modules/jsdom/lib/jsdom/virtual-console.js:29 Error: Not implemented: window.scrollTo at Object.<anonymous>.module.exports (/private/var/www/samplesite.com/node_modules/jsdo

我的React组件调用
窗口。滚动到
,当我运行jest测试时,它们通过了,但出现了控制台错误:

 console.error node_modules/jsdom/lib/jsdom/virtual-console.js:29
Error: Not implemented: window.scrollTo
    at Object.<anonymous>.module.exports (/private/var/www/samplesite.com/node_modules/jsdom/lib/jsdom/browser/not-implemented.js:9:17)
    at Window.scrollTo (/private/var/www/samplesite.com/node_modules/jsdom/lib/jsdom/browser/Window.js:544:7)
    at scrollTo (/private/var/www/samplesite.com/back-end/utils/library.jsx:180:12)
    at commitHookEffectList (/private/var/www/samplesite.com/node_modules/react-dom/cjs/react-dom.development.js:17283:26)
    at commitPassiveHookEffects (/private/var/www/samplesite.com/node_modules/react-dom/cjs/react-dom.development.js:17307:3)
    at Object.invokeGuardedCallbackImpl (/private/var/www/samplesite.com/node_modules/react-dom/cjs/react-dom.development.js:74:10)
    at invokeGuardedCallback (/private/var/www/samplesite.com/node_modules/react-dom/cjs/react-dom.development.js:256:31)
    at commitPassiveEffects (/private/var/www/samplesite.com/node_modules/react-dom/cjs/react-dom.development.js:18774:9)
    at wrapped (/private/var/www/samplesite.com/node_modules/react-dom/node_modules/scheduler/cjs/scheduler-tracing.development.js:207:34)
    at flushPassiveEffects (/private/var/www/samplesite.com/node_modules/react-dom/cjs/react-dom.development.js:18822:5) undefined
尝试2:

let scrollTo = jest.fn();
Object.defineProperty(window, "scrollTo", scrollTo);
尝试3:

delete global.window.scrollTo;
global.window.scrollTo = () => {};
尝试4:

global.window = {};
global.window.scrollTo = () => {};
如何消除此控制台错误?谢谢。

设置 window.scrollTo=jest.fn(); 应该可以工作,如果您想为整个项目而不是每个测试文件单独定义它,您可以在中定义它


或者在使用react脚本时,您可以在每个测试用例中的./src/setupTests.js

mock
窗口中定义它。或者,将模拟代码放入
window.setup.js
文件中,并将该文件的路径添加到jest
setupFiles
配置中,这两种方法都可以正常工作

比如说,

index.spec.tsx

import React,{Component}来自'React';
类SomeComponent扩展组件{
建造师(道具){
超级(道具);
this.handleClick=this.handleClick.bind(this);
}
handleClick(e){
e、 预防默认值();
滚动到(0,0);
}
render(){
返回(
点击我!
);
}
}
导出默认组件;
index.spec.tsx
,mock
窗口。在每个测试用例中滚动到

从“React”导入React;
从“酶”导入{shall};
从“/”导入某些组件;
描述('SomeComponent',()=>{
测试('应处理单击',()=>{
常量包装器=浅();
const mEvent={preventDefault:jest.fn()};
window.scrollTo=jest.fn();
wrapper.find('button').simulate('click',mEvent));
expect(mEvent.preventDefault).toBeCalled();
期望(window.scrollTo).toBeCalledWith(0,0);
});
});
jest.config.js

window.scrollTo = jest.fn();
module.exports={
预设:“ts笑话”,
测试环境:“酶”,
//setupFiles:['/Users/ldu020/workspace/github.com/mrdulin/jest-codelab/src/stackoverflow/58585527/window.setup.js'],
setupFilesAfterEnv:['jest-Ezyme'],
测试环境选项:{
酶适配器:“反应16”
},
coverageReporters:['json','text','lcov','clover']
};
单元测试结果:

通过src/stackoverflow/58585527/index.spec.tsx(6.114s)
某些成分
✓ 应处理点击(12毫秒)
测试套件:1个通过,共1个
测试:1项通过,共1项
快照:共0个
时间:6.947秒
或者,创建一个
window.setup.js
文件,并将该文件的路径放入jest
setupFiles

window.setup.js

window.scrollTo = jest.fn();
jest.config.js

window.scrollTo = jest.fn();
module.exports={
预设:“ts笑话”,
测试环境:“酶”,
setupFiles:['/Users/ldu020/workspace/github.com/mrdulin/jest-codelab/src/stackoverflow/58585527/window.setup.js'],
setupFilesAfterEnv:['jest-Ezyme'],
测试环境选项:{
酶适配器:“反应16”
},
coverageReporters:['json','text','lcov','clover']
};
单元测试结果:

PASS src/stackoverflow/58585527/index.spec.tsx
某些成分
✓ 应处理点击(12毫秒)
测试套件:1个通过,共1个
测试:1项通过,共1项
快照:共0个
时间:3.33秒,估计7秒
他们两个都很好


源代码:

try{}catch(err{}
?我不应该在我的产品代码中添加
try/catch
来满足Jest,我应该吗?尝试在Jest函数本身中添加
window.scrollTo={}
(不要在前一行定义
window
):添加
window.scrollTo==()={>}
在jest中,函数确实起作用。我只想这样做一次(在包含Jest的
setupFiles
config的文件中),但将代码放在那里是行不通的。想法?不幸的是,我没有:(谢谢你花时间回答。当我把
window.scrollTo=()=>{};
放在window.setup.js中并包含在jest.config.js(在
setupFiles
下)中,当我运行我的测试时,我得到了错误:
ReferenceError:window没有定义
。如果我首先声明
let window={}
,测试通过了,但我得到了原始的
错误:未实现:window.scrollTo
错误。请注意,如果调用了
window.scrollTo
,我并不测试,我不在乎,这只是碰巧发生在我测试的页面上。感谢您花时间回答。当我放入
window.scrollTo=jest.fn()
;在window.setup.js中,并将其包含在jest.config.js中(在
setupfileafterenv
下),当我运行测试时,我得到错误:
ReferenceError:window未定义
。如果我首先声明
let window={}
,测试通过了,但我得到了原始的
错误:未实现:window.scrollTo
错误。请注意,如果调用了
window.scrollTo
,我不会进行测试,我不在乎这一点,我正在测试的页面上碰巧发生了这种情况。