Javascript 如何在开玩笑时监视window.scrollTo?

Javascript 如何在开玩笑时监视window.scrollTo?,javascript,unit-testing,mocking,jestjs,spy,Javascript,Unit Testing,Mocking,Jestjs,Spy,我得到了一个功能非常简单的react组件: componentDidMount() { window.scrollTo(0, 0) } 似乎你不能做像这样的事情 window.scrollTo = jest.fn() 要监视功能,请滚动至功能 因此,我想知道监视这个函数并断言它已在我的测试中使用的最佳方法是什么 谢谢开玩笑说,全局名称空间必须通过全局而不是窗口访问 global.scrollTo = jest.fn() 正如Andreas所说,您需要通过全局名称空间访问scrollTo

我得到了一个功能非常简单的react组件:

componentDidMount() {
  window.scrollTo(0, 0)
}
似乎你不能做像这样的事情

window.scrollTo = jest.fn()
要监视
功能,请滚动至
功能

因此,我想知道监视这个函数并断言它已在我的测试中使用的最佳方法是什么


谢谢

开玩笑说,全局名称空间必须通过
全局
而不是
窗口
访问

global.scrollTo = jest.fn()

正如Andreas所说,您需要通过全局名称空间访问
scrollTo()
。但要监视它并做出断言,需要将spy函数分配给一个变量。大概是这样的:

const scrollToSpy = jest.fn();
global.scrollTo = scrollToSpy;
...
expect(scrollToSpy).toHaveBeenCalled();

我有一个类似的问题,只是分配间谍不适合我

最终,我能够用这段代码实现这一点

const spyScrollTo=jest.fn();
defineProperty(global.window,'scrollTo',{value:spyScrollTo});
开玩笑的是,我可以这样检查它

const spyScrollTo=jest.fn();
描述('myComponent',()=>{
在每个之前(()=>{
defineProperty(global.window,'scrollTo',{value:spyScrollTo});
defineProperty(global.window,'scrollY',{value:1});
spyScrollTo.mockClear();
});
它('调用window.scrollTo',()=>{
myComponent();
期待(间谍克罗托)。与…一起被指控({
排名:1,
行为:“平滑”,
});
});
});
依赖项:

"enzyme": "^3.10.0",
"enzyme-adapter-react-16": "^1.14.0",
"jest": "^24.8.0"
"jest-environment-enzyme": "^7.1.1",
"jest-enzyme": "^7.1.1",
"jsdom": "^15.1.1"
window.scrollTo=jest.fn()
工作正常

例如:

index.spec.tsx

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

从“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

module.exports={
预设:“ts笑话”,
测试环境:“酶”,
setupFilesAfterEnv:['jest-Ezyme'],
测试环境选项:{
酶适配器:“反应16”
},
coverageReporters:['json','text','lcov','clover']
};
单元测试结果:

PASS src/stackoverflow/58585527/index.spec.tsx
某些成分
✓ 应处理点击(13毫秒)
测试套件:1个通过,共1个
测试:1项通过,共1项
快照:共0个
时间:2.932s,估计3s

源代码:

谢谢,它确实有效,但我必须在我的
setupTests.js
和我的实际测试中定义
global.scrollTo=jest.fn()
,否则它是
未定义的。你能告诉我为什么吗?@AmirHoseinian=你在setupTests.js中更新了哪里?你找到了解决方案吗?
expect(window.scrollTo).toBeCalledWith(0,0)是我的窍门。在我得到一些错误之前,通过使用Martin的回答“预期2个参数,但得到1”,您可以通过
expect(global.scrollTo).tohavebeencall()避免声明