Jest/React 模拟 scrollBy 和 .getBoundingClientRect 函数
Jest/React mock scrollBy and .getBoundingClientRect function
我有一个函数 handleClick,它在一个元素上使用 scrollBy,该元素使用 getBoundingClientRect 获取它的第一个参数。我正在尝试使用 jest/enzyme 对此进行测试。
class myClass extends Component {
...
...
handleClick () {
document.getElementById('first-id').scrollBy(document.getElementById('second-id').getBoundingClientRect().width, 0);
}
render() {
return (
<button className="my-button" onClick={this.handleClick()}>scroll</button>
);
}
}
我的测试:
it('calls scrollBy with correct params', () => {
const props = {};
myClassWrapper = mount(<myClass {...props} />);
const scrollBySpy = jest.fn();
global.document.getElementById = jest.fn(() => ({ scrollBy: scrollBySpy }));
myClassWrapper.find('my-button').simulate('click');
// expect(scrollBySpy).toHaveBeenCalledWith()
});
我正在尝试测试是否使用正确的参数调用了 scrollBy,但是在 运行 此测试时出现以下错误:
Error: Uncaught [TypeError: document.getElementById(...).getBoundingClientRect is not a function]
抱歉,如果之前有人回答过这个问题,但我看不到任何可以回答我的情况的内容。提前谢谢你。
scrollBy
在 getElementById
的第一个结果上调用,getBoundingClientRect
在 getElementById
的第二个结果上调用,因此您需要包含这两个函数在模拟中返回的对象上。
这是一个可以帮助您入门的工作示例:
import * as React from 'react';
import { mount } from 'enzyme';
class MyClass extends React.Component {
handleClick() {
document.getElementById('first-id').scrollBy(document.getElementById('second-id').getBoundingClientRect().width, 0);
}
render() {
return (
<button className="my-button" onClick={this.handleClick}>scroll</button>
);
}
}
it('calls scrollBy with correct params', () => {
const props = {};
const myClassWrapper = mount(<MyClass {...props} />);
const scrollBySpy = jest.fn();
const getBoundingClientRectSpy = jest.fn(() => ({ width: 100 }));
global.document.getElementById = jest.fn(() => ({
scrollBy: scrollBySpy,
getBoundingClientRect: getBoundingClientRectSpy // <= add getBoundingClientRect
}));
myClassWrapper.find('.my-button').simulate('click');
expect(scrollBySpy).toHaveBeenCalledWith(100, 0); // Success!
});
我有一个函数 handleClick,它在一个元素上使用 scrollBy,该元素使用 getBoundingClientRect 获取它的第一个参数。我正在尝试使用 jest/enzyme 对此进行测试。
class myClass extends Component {
...
...
handleClick () {
document.getElementById('first-id').scrollBy(document.getElementById('second-id').getBoundingClientRect().width, 0);
}
render() {
return (
<button className="my-button" onClick={this.handleClick()}>scroll</button>
);
}
}
我的测试:
it('calls scrollBy with correct params', () => {
const props = {};
myClassWrapper = mount(<myClass {...props} />);
const scrollBySpy = jest.fn();
global.document.getElementById = jest.fn(() => ({ scrollBy: scrollBySpy }));
myClassWrapper.find('my-button').simulate('click');
// expect(scrollBySpy).toHaveBeenCalledWith()
});
我正在尝试测试是否使用正确的参数调用了 scrollBy,但是在 运行 此测试时出现以下错误:
Error: Uncaught [TypeError: document.getElementById(...).getBoundingClientRect is not a function]
抱歉,如果之前有人回答过这个问题,但我看不到任何可以回答我的情况的内容。提前谢谢你。
scrollBy
在 getElementById
的第一个结果上调用,getBoundingClientRect
在 getElementById
的第二个结果上调用,因此您需要包含这两个函数在模拟中返回的对象上。
这是一个可以帮助您入门的工作示例:
import * as React from 'react';
import { mount } from 'enzyme';
class MyClass extends React.Component {
handleClick() {
document.getElementById('first-id').scrollBy(document.getElementById('second-id').getBoundingClientRect().width, 0);
}
render() {
return (
<button className="my-button" onClick={this.handleClick}>scroll</button>
);
}
}
it('calls scrollBy with correct params', () => {
const props = {};
const myClassWrapper = mount(<MyClass {...props} />);
const scrollBySpy = jest.fn();
const getBoundingClientRectSpy = jest.fn(() => ({ width: 100 }));
global.document.getElementById = jest.fn(() => ({
scrollBy: scrollBySpy,
getBoundingClientRect: getBoundingClientRectSpy // <= add getBoundingClientRect
}));
myClassWrapper.find('.my-button').simulate('click');
expect(scrollBySpy).toHaveBeenCalledWith(100, 0); // Success!
});