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

2024-05-20

我想使用 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) 才不是。我清楚地am呼叫clickHandler as otherMethod如果我没有的话就不会被叫到,但是toHaveBeenCalled没有被接走clickHandler不知何故。为什么?

我明白我真的不需要使用任何一个.bind(this) or .and.callThrough() on otherMethod但我同时使用这两种方法只是为了相同地对待这两种方法并将它们用于otherMethod实际上不应该有任何区别。

这另一个答案 https://stackoverflow.com/a/39392552/5218951指出我必须在将函数附加为侦听器之前监视该函数。如果这是我的问题,那么我不知道如何解决它:spyOn语法要求该方法是对象的属性 (component在这种情况下)但使用component需要事先安装MyComponent这迫使我首先附加监听器。

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


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

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

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

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

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

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

希望能帮助到你!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

即使我可以监视其他方法,也无法监视事件处理程序 的相关文章

随机推荐

  • 如何获取 WebElement 的父级[重复]

    这个问题在这里已经有答案了 我试过了 private WebElement getParent final WebElement webElement return webElement findElement By xpath 但我得到
  • 查询参数更改时,路线不会更新

    在我的应用程序中 有多个链接 其中我有一些links与相同的route但与不同的query parameters 比如说 我有这样的链接 deposits withdrawals deposits withdrawals id 1 depo
  • 如何使用自定义 DbFunction 将字符串转换为小数

    我有一个将小数 和其他类型 保存为字符串的表 我想在数据库上下文上编写一个 Linq 查询 该查询将转换为数据库转换而不是本地转换 出于性能原因 This 非工作的example 从概念上讲是我想要实现的目标 using var conte
  • Perl:正则表达式不抓取代码中的多行 C 风格注释

    我有一个 Perl 程序 读取用 C 编写的 SRC 文件 使用 SRC 文件中的正则表达式匹配来查找特定格式的数据以用作目标文件名 打开新的目标文件 执行另一个正则表达式匹配以查找包含关键字 abcd 的所有 C 风格注释 注意 这些注释
  • 将 CSS 类添加到 TagHelper 中的 html 元素

    在 ASP NET Core 视图中 我有以下内容 div class message div 我使用以下 TagHelper 来创建 Tag Helper HtmlTargetElement div Attributes MessageN
  • 什么是扩展方法?

    NET 中的扩展方法是什么 编辑 我已在以下位置发布了后续问题扩展方法的使用 https stackoverflow com questions 403619 usage of extension methods 扩展方法允许开发者向公众添
  • Java 服务器-客户端 readLine() 方法

    我有一个客户端类和一个服务器类 如果客户端向服务器发送消息 服务器会将响应发送回客户端 然后客户端将打印它收到的所有消息 例如 如果客户端向服务器发送 A 则服务器将向客户端发送响应 1111 所以我在客户端类中使用 readLine 从服
  • Leaflet js虚构地图

    我是 Leaflet 的新手 我想了解如何创建完全交互式的虚构地图 我有一张图像想要转换为传单地图 该图像基本上像图表一样具有许多连接和点 我想首先将该图像转换为地图 能够将鼠标悬停在这些点上 突出显示它们并显示有关它们的信息 并且还可以在
  • F# 尝试处理未处理的异常

    在下面的代码中 我想读取一个文件并返回所有行 如果存在 IO 错误 我希望程序退出并将错误消息打印到控制台 但程序仍然遇到未处理的异常 对此的最佳实践是什么 我想我不需要Some None因为无论如何我都希望程序在错误时退出 谢谢 let
  • 如何计算numpy数组中元素的频率?

    我有一个 3 D numpy 数组 其中包含重复的元素 counterTraj shape 13530 1 1 例如 counterTraj 包含这样的元素 我只显示了几个元素 array 136 129 130 103 102 101 我
  • 自动包含在 Visual Studio 外部创建的新文件

    Problem 如果我将图像保存在项目文件夹结构中的某个位置 则在 Visual Studio 外部创建的图像不会自动包含到我的项目中 问题 有没有办法自动包含添加到项目中任何文件夹中的新文件 我还使用源代码管理 团队基础服务器 如果新文件
  • 具有定制损失函数的随机森林

    我是机器学习领域的初学者 对于一个项目 我必须在随机森林分类中使用自定义损失函数 到目前为止我一直使用 scikit 通过 scikit 实现这一点的建议会更有帮助 损失函数 分类树中的基尼杂质和熵 在 scikit 的 tree pyx
  • 如何查看 Android 上的 Wi-Fi 是否已连接?

    我什至不希望我的用户尝试下载某些内容 除非他们连接了 Wi Fi 然而 我似乎只能判断是否启用了 Wi Fi 但他们仍然可以有 3G 连接 android net wifi WifiManager m WifiManager getSyst
  • Angular 无法检测到从 Ngxs 状态发出的 Http 请求(区域相关问题)

    我正在使用 ngx progressbar 它可以很好地处理从服务 组件或解析器内部启动的 http 请求 请注意 在 http 请求期间不需要手动触发进度条 通过服务等 它是自动触发的 不幸的是 当从 NGXS State 中发出 htt
  • 将子目录添加到加载路径

    我希望能够自动加载它们 而不是单独指定插件目录中的每个子目录 为此 我将以下内容包含到我的 emacs 文件中 let base emacs d plugins normal top level add subdirs to load pa
  • 为什么Python的curses中escape键有延迟?

    In the Python curses module I have observed that there is a roughly 1 second delay between pressing the esc key and getc
  • 使用 CryptoJS 更改密钥 [重复]

    这个问题在这里已经有答案了 我正在使用 CryptoJS 来加密和解密文本 在这里 我只是获取消息并显示加密和解密消息 我使用DES算法进行加密和解密 这是我的 HTML 文件
  • 如何为背景图像添加边距?

    我想向背景图像添加边距 以便将其与屏幕中间保持距离 但将其添加到该类中会为整个主体添加边距 body poppage background url Imagenes tip3 png 50 200px no repeat E2E4E9 我怎
  • Orchard CMS:向字段添加默认数据,然后查询它们

    我已使用与内容类型同名的部分向内容类型添加了一个名为 Website 的 LinkField ContentDefinitionManager AlterTypeDefinition MyContentType a gt a WithPar
  • 即使我可以监视其他方法,也无法监视事件处理程序

    我想使用 Jest Jasmine Enzyme 测试 React 中的事件处理程序 MyComponent js import React from react class MyComponent extends React Compon