如何监视窗口.滚动到开玩笑



我得到了一个非常简单的反应组件,具有以下功能:

componentDidMount() {
  window.scrollTo(0, 0)
}

似乎你不能做这样的事情

window.scrollTo = jest.fn()

监视scrollTo功能。

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

谢谢

开玩笑地说,全局名称空间必须由global访问,而不是window

global.scrollTo = jest.fn()

我遇到了类似的问题,只是分配间谍对我不起作用。

最终我能够使用此代码进行此操作

const spyScrollTo = jest.fn();
Object.defineProperty(global.window, 'scrollTo', { value: spyScrollTo });

然后在开玩笑中,我能够像这样检查它

const spyScrollTo = jest.fn();
describe('myComponent', () => {
  beforeEach(() => {
    Object.defineProperty(global.window, 'scrollTo', { value: spyScrollTo });
    Object.defineProperty(global.window, 'scrollY', { value: 1 });
    spyScrollTo.mockClear();
  });
  it('calls window.scrollTo', () => {
    myComponent();
    expect(spyScrollTo).toHaveBeenCalledWith({
      top: 1,
      behavior: 'smooth',
    });
  });
});

就像Andreas说的,你需要通过全局命名空间访问scrollTo()。但是要监视它并做出断言,您需要将间谍功能分配给一个变量。像这样:

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

依赖关系:

"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 } from 'react';
class SomeComponent extends Component {
  constructor(props) {
    super(props);
    this.handleClick = this.handleClick.bind(this);
  }
  handleClick(e) {
    e.preventDefault();
    window.scrollTo(0, 0);
  }
  render() {
    return (
      <div>
        <button onClick={this.handleClick}>Click Me!</button>
      </div>
    );
  }
}
export default SomeComponent;

index.spec.tsx ,在每个测试用例中模拟window.scrollTo

import React from 'react';
import { shallow } from 'enzyme';
import SomeComponent from './';
describe('SomeComponent', () => {
  test('should handle click', () => {
    const wrapper = shallow(<SomeComponent></SomeComponent>);
    const mEvent = { preventDefault: jest.fn() };
    window.scrollTo = jest.fn();
    wrapper.find('button').simulate('click', mEvent);
    expect(mEvent.preventDefault).toBeCalled();
    expect(window.scrollTo).toBeCalledWith(0, 0);
  });
});

jest.config.js

module.exports = {
  preset: 'ts-jest',
  testEnvironment: 'enzyme',
  setupFilesAfterEnv: ['jest-enzyme'],
  testEnvironmentOptions: {
    enzymeAdapter: 'react16'
  },
  coverageReporters: ['json', 'text', 'lcov', 'clover']
};

单元测试结果:

 PASS  src/stackoverflow/58585527/index.spec.tsx
  SomeComponent
    ✓ should handle click (13ms)
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        2.932s, estimated 3s

源代码:https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/58585527

其他答案都不适合我

这是有效的

jest.spyOn(window, 'scroll').mockImplementation(() => { });

最新更新