解决 Enzyme 测试中出现的 “wrapper.state() is not a function” 错误提示

解决 Enzyme 测试中出现的 “wrapper.state() is not a function” 错误提示

在进行前端自动化测试时,Enzyme 是一个常用的工具库之一。使用 Enzyme 进行测试时,有时会遇到“wrapper.state() is not a function” 错误提示,这篇文章将为大家提供解决方案。

问题背景

当我们使用 Enzyme 进行 React 组件测试时,有时需要获取组件的 state 数据,用法如下:

------ - ------- - ---- ---------
------ ----- ---- --------
------ ----------- ---- ---------------

---------- ------ --- --------- ---- ------- ------- -- -- -
  ----- ------- - -------------------- ----
  ----------------------------------------------------
---

然而在有些情况下,却会出现如下错误:

---------- ------------- -- --- - --------

这是因为我们在 Enzyme 的 ReactWrapper 上使用了 state 方法,而它并没有定义 state 方法,而只有 shallow 和 mount 这两个方法才有 state 方法。

解决方案

1. 使用 shallow 方法获取 state

我们可以使用 shallow 方法获取组件的 state,如下所示:

------ - ------- - ---- ---------
------ ----- ---- --------
------ ----------- ---- ---------------

---------- ------ --- --------- ---- ------- ------- -- -- -
  ----- ------- - -------------------- ----
  ----------------------------------------------------
---

2. 使用 instance 方法获取 state

我们也可以使用 instance 方法获取组件实例,并在实例上调用 state 方法,如下所示:

------ - ----- - ---- ---------
------ ----- ---- --------
------ ----------- ---- ---------------

---------- ------ --- --------- ---- ------- ------- -- -- -
  ----- ------- - ------------------ ----
  ----- -------- - -------------------
  --------------------------------------------------
---

3. 使用 state 方法前确认 wrapper 存在

当 Enzyme 的 ReactWrapper 未被定义时,我们也需要先判断其是否存在,然后再使用 state 方法,如下所示:

------ - ------- - ---- ---------
------ ----- ---- --------
------ ----------- ---- ---------------

---------- ------ --- --------- ---- ------- ------- -- -- -
  ----- ------- - -------------------- ----
  -------------------- -
    ----------------------------------------------------
  -
---

总结

当出现“wrapper.state() is not a function” 错误提示时,我们可以使用 shallow 方法、instance 方法或先确保 wrapper 存在这三种方式来获取组件的 state。这一点在 Enzyme 测试中非常重要,在使用中需要特别注意。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6651af24d3423812e45d6e76