Jest/Enzyme - 如何在不同的视口进行测试?

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

背景资料:

这是一个例子:


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)

笔记:

  • 有没有办法处理“无法分配给'innerHeight',因为它是只读属性?”吗? (3认同)
  • @kb_ 当测试在“Jest”中运行时,“window”是“jsdom”提供的对象,其“innerHeight”属性是一个普通属性。我猜您将此视为 TypeScript 错误,在这种情况下,您可能需要使用类型断言来告诉 TypeScript 该属性不是只读的。 (2认同)

小智 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)

两者都不是非常好的解决方案,但它们有效。

  • 但你可以用 //@ts-ignore 进行注释 (2认同)