Joe*_*dee 12 viewport jestjs enzyme
我试图在某个视口宽度的组件上运行测试.我正在做以下事情,但这似乎没有改变它:
test('Component should do something at a certain viewport width.', () => {
global.innerWidth = 2000;
const component = mount(<SomeComponent />);
...
});
Run Code Online (Sandbox Code Playgroud)
我还发现了一篇文章,解释了如何使用JSDom来实现它,但是当Jest现在随JSDom提供时,我想知道是否有本机解决方案.
https://www.codementor.io/pkodmad/dom-testing-react-application-jest-k4ll4f8sd
Bri*_*ams 16
背景资料:
jsdom 不执行 window.resizeBy()或window.resizeTo()jsdom 将window innerWidth和innerHeight定义为1024 x 768jsdom通过手动设置window.innerWidth和window.innerHeight 来模拟窗口调整大小并触发resize事件这是一个例子:
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>;
}
}
Run Code Online (Sandbox Code Playgroud)
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>');
});
});
Run Code Online (Sandbox Code Playgroud)
笔记:
Enzymev3开始,shallow 调用React生命周期方法componentDidMount()就可以代替它了mount小智 9
如果您使用的是 TypeScript,它会抱怨 window.innerWidth/innerHeight 是只读的。您可以通过重新声明属性来解决此问题:
Object.defineProperty(window, 'innerWidth', {writable: true, configurable: true, value: 105})
Run Code Online (Sandbox Code Playgroud)
或使用 Object.assign 方法:
window = Object.assign(window, { innerWidth: 105 });
Run Code Online (Sandbox Code Playgroud)
两者都不是非常好的解决方案,但它们有效。
| 归档时间: |
|
| 查看次数: |
6424 次 |
| 最近记录: |