玩笑测试因 refs 和 Form 失败

2024-05-06

我有一个搜索栏组件,如下所示:

  render () {
    const { onChangeTextInput } = this.props
    return (
      <Form
        name="searchForm"
        ref={(ref) => {
          this.searchForm = ref
        }}
      >
        <TextInput
          noSpacing
          placeholder={t('search')}
          name="search"
          validate="text"
          icon={this.icon}
          onChangeTextCallback={() => {
            onChangeTextInput(this.searchForm.values)
          }}
        />
        )
      </Form>
    )
  }
}

我正在使用浅层渲染和玩笑来运行单元测试来测试以下场景”

  1. 用户在文本输入中键入一个字符
  2. 回调方法被触发,为用户提供文本作为参数。

我正在运行的测试声明如下:

 test('SearchBar returns value on text change', () => {
        const onChangeFunction = jest.fn()
        const obj = shallow(
          <SearchBar onChangeTextInput={onChangeFunction} />
        )
        obj.find('TextInput').props().onChangeTextCallback('h')
        expect(onChangeFunction).toHaveBeenCalledWith('h')
      })

我收到一个奇怪的错误,指出:

TypeError: Cannot read property 'values' of undefined

  51 |           icon={this.icon}
  52 |           onChangeTextCallback={() => {
> 53 |             onChangeTextInput(this.searchForm.values)
     |                                                 ^
  54 |           }}
  55 |         />
  56 |         )

我用于测试的 obj.html() 转储如下所示:

<Form name="searchForm" if={true}>
  <TextInput
    noSpacing={true}
    placeholder="search"
    name="search"
    validate="text"
    icon={{
      $$typeof: Symbol(react.element),
      type: [(Function: Icon)],
      key: null,
      ref: null,
      props: {
        name: "search",
        size: 25,
        color: "#00a8ca",
        style: { position: "absolute", right: 0, bottom: 7 },
        allowFontScaling: false,
        type: "MaterialIcons",
        if: true,
      },
      _owner: null,
      _store: {},
    }}
    onChangeTextCallback={[(Function: onChangeTextCallback)]}
    value={null}
    style={{}}
    hasFloatingLabel={true}
    numberOfLines={1}
    isPassword={false}
    if={true}
  />
  )
</Form>

这里发生了什么?我有自定义表单,可以通过参考为我提供值。我是否需要做一些事情并初始化 Form 组件?请帮忙,我对这个东西比较陌生。


Issue

The ref回调没有被调用,所以this.searchForm is undefined when onChangeTextCallback()被调用。

Details

来自回调参考 https://reactjs.org/docs/refs-and-the-dom.html#callback-refs文档:“当组件安装时,React 将使用 DOM 元素调用 ref 回调”。

在测试中您正在使用shallow()。浅层渲染不会挂载组件,因此ref回调永远不会被调用。

Solution

安装组件。既然你已经在使用Enzyme您可以使用mount() http://airbnb.io/enzyme/docs/api/mount.html。请注意,“完整的 DOM 渲染要求完整的 DOM API 在全局范围内可用”,例如Jest你可以配置要使用的测试环境jsdom https://jestjs.io/docs/en/configuration#testenvironment-string.

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

玩笑测试因 refs 和 Form 失败 的相关文章

随机推荐

  • 使用试运行选项运行黄瓜时出错

    我试图通过仅打开和关闭浏览器一次来提高运行测试的速度 http watirmelon com 2012 04 01 Five page object anti patterns http watirmelon com 2012 04 01
  • 如何在Eclipse中配置Tesseract进行Android开发?

    我已经从事 Android 工作 6 个月了 至此我对Android开发有了基本的了解 现在我想使用 Tesseract 开发一个 OCR Android 应用程序 为此 我从 Tesseract 下载了 android ndk r6b t
  • 在 less 中为 twitter bootstrap 的所有选择器添加前缀

    我想开始学习 Twitter Bootstrap 并将其合并到我的网站中 从表单元素开始 但如果我按原样包含它 它会破坏网站的其余部分 我想为所有选择器添加前缀 以便我可以逐渐添加引导样式的内容 如下所示 div class bootstr
  • 将密码存储到sql中的最佳方法

    在我当前的 C Windows 应用程序中 密码已以纯文本形式存储 这显然不好 所以我只想知道加密密码并存储到 SQL Server 中的最佳方法是什么 我读到使用哈希 盐更好 但我觉得sql 2005中的 EncryptByPassPhr
  • Hadoop:读取ORC文件并放入RDBMS中?

    我有一个以 ORC 文件格式存储的配置单元表 我想将数据导出到 Teradata 数据库 我研究了 sqoop 但找不到导出 ORC 文件的方法 有没有办法让 sqoop 为 ORC 工作 或者有什么其他工具可以用来导出数据 Thanks
  • OpenGL 着色器不与着色器程序链接

    我正在尝试使用 GLFW GLEW 添加着色器 我收到一个错误 指出着色器已加载 但它们没有有效的对象代码 这是我用于加载着色器的代码 class SHADER public void LoadShaders const char vert
  • 如何检查特定作业是否在quartz调度程序中运行#

    我正在使用石英调度程序根据触发器的用户输入来安排写入文件的作业 我想检查作业是否仍在 stop 方法中运行 如何检查作业是否仍在运行 public class JobScheduler static StdSchedulerFactory
  • 将 WebApp 授权给 ADFS 以访问 Dynamics CRM Web API

    我有一个 Web 应用程序需要与 Dynamics CRM 365 Web API 通信 Dynamics CRM 配置为 ADFS 上的依赖方 服务器是 Windows Server 2016 一切都在本地 而不是在 Azure 上 我为
  • 导入 org.ksoap2.SoapEnvelope 时遇到问题

    正在使用网络服务 从互联网上获取了一些示例代码 导入时出现一些错误 import org ksoap2 SoapEnvelope import org ksoap2 serialization SoapObject import org k
  • 如何从 CustomViewController 中更改 RootViewController(在 AppDelegate 中)?

    再会 我的应用程序具有在 AppDelegate 中加载的授权表单 SigninController 登录后 在 SigninController m 中检查 应该出现 TabBarController 作为应用程序的主视图 如何将控制器从
  • BigQuery 数据类型

    我正在开始一个新项目 只是想在定义表模式之前进行验证 BigQuery 是否支持以下以外的其他功能 string integer float boolean BigQuery 数据类型官方文档 https cloud google com
  • python 中打印变量和字符串

    好吧 我知道如何打印变量和字符串 但是我如何打印类似 我的字符串 card price 的内容 它是我的变量 我的意思是 这是我的代码 print I have and here I would like to print my varia
  • 如何在 Dart 中打印美元符号 $

    我实际上需要在 Dart 中在变量之前打印一个美元符号 例如 void main int dollars 42 print I have dollars I have 42 我希望输出为 我有 42 美元 我怎样才能做到这一点 谢谢 飞镖弦
  • Java:删除链表中的所有元素

    Java中如何删除链表中的所有元素without使用已经可用的clear 方法 这项练习的灵感来自于电话采访中收到的一个问题 说我可以用 C 来做这个 void DeleteAllElement ListElement head ListE
  • 用于分享帖子的 Yammers REST API

    我想使用 REST API 从我的业务应用程序共享帖子 不是发布新消息 而是共享现有帖子 有谁知道要使用哪个端点以及如何实现它 当您使用 Yammer API 创建新帖子时 请将参数 shared message id 与要共享的消息的 m
  • 为什么 justify-content 不以我的 div 为中心?

    我试图将两个 div 水平居中放在爸爸 div 内 爸爸 div 设置为flex direction column因为我希望子 div 一个在另一个之下 但位于页面的中心 justify content center 应该做但不起作用 我终
  • 如何注释 .tsx 文件中的属性?

    给出以下 JSX 代码 div div 我怎样才能注释掉className my class className my class 不起作用 className my class 不起作用 TS1005 expected className
  • 如何在Azure数据工厂中传递不记名令牌API

    我有一个 API 它具有授权和不记名令牌 我在邮递员中进行了测试 它正在工作 但是 当我在 ADF 中使用 Web 活动时 它不起作用 我在 URL 部分传递 url 创建新标头 输入授权并指定值 Bearer token 出现以下错误 E
  • 有没有办法找到哪些 .NET 类实现了某个接口?

    例如 如果我想查看我的 NET 选项用于实现 IList 或 IDictionary 有没有办法找到它 例如在 MSDN 文档中 我认为可以使用反射器 http www red gate com products reflector
  • 玩笑测试因 refs 和 Form 失败

    我有一个搜索栏组件 如下所示 render const onChangeTextInput this props return