gpt4 book ai didi

javascript - 即使我可以监视其他方法,也无法监视事件处理程序

转载 作者:行者123 更新时间:2023-11-29 21:10:44 25 4
gpt4 key购买 nike

我想使用 Jest/Jasmine/Enzyme 在 React 中测试事件处理程序。

MyComponent.js:

import React from 'react';
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.clickHandler = this.clickHandler.bind(this);
this.otherMethod = this.otherMethod .bind(this);
}

clickHandler() { this.otherMethod(); }
otherMethod() {}

render() { return <div onClick={this.clickHandler}/>; }
}
export default MyComponent;

MyComponent.test.js:

import React from 'react';
import {mount} from 'enzyme';
import MyComponent from './MyComponent';

it('should work', () => {
const componentWrapper = mount(<MyComponent/>);
const component = componentWrapper.get(0);

spyOn(component, 'otherMethod' ).and.callThrough();
spyOn(component, 'clickHandler').and.callThrough();

componentWrapper.find('div').simulate('click');

expect(component.otherMethod ).toHaveBeenCalled(); // works
expect(component.clickHandler).toHaveBeenCalled(); // does not work
});

尽管我认为我在监视两个组件方法,但其中一个(对于 otherMethod)有效,而另一个(对于 clickHandler) ) 才不是。我显然 正在 调用 clickHandler,因为如果我不调用 otherMethod 就不会调用,但是 toHaveBeenCalled 不是不知何故,clickHandler 没有被选中。为什么?

我知道我真的不必在 otherMethod 上使用 .bind(this).and.callThrough()但我使用两者只是为了相同地对待这两种方法,并且在 otherMethod 上使用它们实际上应该没有任何区别。

This other SO answer声明我必须在将函数附加为监听器之前监视它。如果这是我的问题,那么我不知道如何解决它:spyOn 语法要求该对象是该方法的属性(在本例中为 component)但是使用 component 需要事先安装 MyComponent,这迫使我首先附加监听器。

我的代码使用 React 可能是相关的(因此我将 reactjs 作为问题标签包含在内)但不知何故我对此表示怀疑。

最佳答案

对于此类测试,常见的方法是在组件实例上调用处理程序方法,而不是模拟事件。

你可以确定 onClick prop 是由 React 团队测试的,你可以检查的是当“他们”调用你的处理程序时会发生什么。

这还允许您使用浅层渲染,至少对我来说要快得多。您可以使用包装器中的 instance() 方法轻松获得对该实例的引用,然后您可以调用您的处理程序并监视任何您想要的东西。

const wrapper = mount(<MyComponent />)
const instance = wrapper.instance()
instance.clickHandler()
//assert whatever

事实上,可能将您的 spy 附加到实例的方法(已经绑定(bind))也能达到目的。 :)

http://airbnb.io/enzyme/docs/api/ReactWrapper/instance.html

希望对您有所帮助!

关于javascript - 即使我可以监视其他方法,也无法监视事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42016405/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com