我一直在与一个新团队一起开发 React 应用程序,讨论围绕为触发 window.scroll 事件方法的组件编写单元测试。
所以,让我们以这个组件为例。
import React, { Component } from 'react';
class MyComponent extends Component {
componentDidMount() {
window.addEventListener('scroll', this.props.myScrollMethod);
}
componentWillUnmount() {
window.removeEventListener('scroll', this.props.myScrollMethod);
}
render() {
return (
<div>
<h1>Hello MyComponent!</h1>
</div>
)
};
};
export default MyComponent;
如您所见,我采用了一个方法,该方法通过 prop 传递到组件中,并将其绑定到窗口事件侦听器,事件是scroll
. 在现实世界中,这个组件会myScrollMethod
在用户向下滚动页面时调用(假设这里的用例是当用户滚动超过页面上的某个点时显示粘性导航栏)。
问题是......我需要找到一种合适的方法来测试这个。我的最终目标是创建一个 spy 方法,该方法通过myScrollMethod
prop传递到组件中,然后触发滚动(或在测试中模拟滚动),最后断言滚动处理程序方法是否已触发。这是我的尝试:
import React from 'react';
import sinon from 'sinon';
import expect, { createSpy } from 'expect';
import { shallow } from 'enzyme';
import MyComponent from './MyComponent';
describe('The <MyComponent /> component', () => {
let onScroll;
let MyTestComponent;
beforeEach(() => {
onScroll = createSpy();
MyTestComponent = shallow(
<MyComponent
myScrollMethod={onScroll}
/>
);
});
it('Should call the onScroll method when a user scrolls', () => {
expect(onScroll).toNotHaveBeenCalled();
window.dispatchEvent(new window.UIEvent('scroll', { detail: 0 }));
expect(onScroll).toHaveBeenCalled();
});
});
我遇到的问题是最终断言失败了,因为间谍从未被调用过。我已经参考了本网站上的许多其他帖子,但到目前为止还没有找到合适的解决方案。任何建议都将不胜感激,因为它已经让我绞尽脑汁有一段时间了!
非常感谢!