我试图在某个视口宽度的组件上运行测试.我正在做以下事情,但这似乎没有改变它:
test('Component should do something at a certain viewport width.',() => { global.innerWidth = 2000; const component = mount(<SomeComponent />); ... });
我还发现了一篇文章,解释了如何使用JSDom来实现它,但是当Jest现在随JSDom提供时,我想知道是否有原生解决方案.
https://www.codementor.io/pkodmad/dom-testing-react-application-jest-k4ll4f8sd
解决方法
背景资料:
> jsdom does not implement window.resizeBy()或window.resizeTo()
> jsdom defines the window innerWidth and innerHeight为1024 x 768
>通过手动设置window.innerWidth和window.innerHeight并触发resize事件,可以使用jsdom模拟窗口调整大小
这是一个例子:
comp.js
import * as React from 'react'; export default class Comp extends React.Component { constructor(...args) { super(...args); this.state = { width: 0,height: 0 } } updateDimensions = () => { this.setState({ width: window.innerWidth,height: window.innerHeight }); } componentDidMount() { this.updateDimensions(); window.addEventListener("resize",this.updateDimensions); } componentWillUnmount() { window.removeEventListener("resize",this.updateDimensions); } render() { return <div>{this.state.width} x {this.state.height}</div>; } }
comp.test.js
import * as React from 'react'; import { shallow } from 'enzyme'; import Comp from './comp'; const resizeWindow = (x,y) => { window.innerWidth = x; window.innerHeight = y; window.dispatchEvent(new Event('resize')); } describe('Comp',() => { it('should display the window size',() => { const component = shallow(<Comp />); expect(component.html()).toEqual('<div>1024 x 768</div>'); resizeWindow(500,300); expect(component.html()).toEqual('<div>500 x 300</div>'); resizeWindow(2880,1800); expect(component.html()).toEqual('<div>2880 x 1800</div>'); }); });
笔记:
>从酶v3浅calls React lifecycle methods like componentDidMount()
开始,因此它可以用来代替安装
>这个答案大量借鉴了here,here,here和@ JoeTidee自己的答案here.