使用 Jest 在 React-Native 中测试组件行为(点击)
Posted
技术标签:
【中文标题】使用 Jest 在 React-Native 中测试组件行为(点击)【英文标题】:Testing component behaviour (click) in React-Native with Jest 【发布时间】:2017-05-11 00:07:04 【问题描述】:假设我有这个组件:
import React, Component from 'react';
import Text, TouchableWithoutFeedback, View from 'react-native';
class MyComp extends Component
onRowPress()
this.myCoolFunction();
myCoolFunction()
console.log('hi');
render()
return (
<TouchableWithoutFeedback onPress=this.onRowPress.bind(this)>
<View>
<Text>Hello World</Text>
</View>
</TouchableWithoutFeedback>
);
export default MyComp;
如何模拟 1 次点击“TouchableWithoutFeedback”并确保“myCoolFunction”被准确调用了 1 次?
如果不是必须的,那么我宁愿不添加除 'react-dom' 和 'react-addons-test-utils' 之外的更多依赖项。
我看到很多指南声称这个和那个,但我担心它们已经过时了,我想确保我不会经历一些不必要的变通方法并让我的代码臃肿。
我有最新版本的 jest/react/react native。
编辑:在Jest's official documentation 中,它说可以使用 Enzyme 或 TestUtils 进行 DOM 测试。如何使用 TestUtils 完成此操作?
【问题讨论】:
看看这个来自 React 页面的tutorial。您应该测试的是 Facebook 建议的组件状态,而不是 onClick 是否已执行。现在,如果您在单击按钮后所期望的是正在调用另一个组件,那么您应该模拟该组件。 如您所见,我的 onClick 不会操纵状态。这些也是反应测试,因此更容易访问 DOM。 【参考方案1】:我知道这个答案不适合您不使用任何其他依赖项的要求,但我认为您不能仅使用 Jest 和 Enzyme 来做到这一点。 Jest 为您提供运行器、断言函数和快照测试,而 Enzyme 执行所有 DOM 操作和事件模拟。但是,要知道您的函数恰好被调用了一次,您将需要其他东西(即间谍)。我们为此使用sinon
,如下所示:
...
const onButtonClick = sinon.spy()
const wrapper = shallow(<MyComponent onButtonClick=onButtonClick/>)
wrapper.find(`img`).first().simulate(`click`)
wrapper.find(`img`).first().simulate(`click`)
expect(onButtonClick.calledTwice).toBe(true)
...
【讨论】:
【参考方案2】:我知道您不想添加其他依赖项,但 underscore 库中有一个函数,名为 once
创建一个只能调用一次的函数版本。对修改后的函数的重复调用将无效,返回原始调用的值。
这样你就可以确定它被调用了一次。
【讨论】:
你可能误解了我的意思。我想知道的是如何使用 jest 来模拟对我的组件的点击。以上是关于使用 Jest 在 React-Native 中测试组件行为(点击)的主要内容,如果未能解决你的问题,请参考以下文章
如何在带有 Jest 的 react-native 中使用模拟的 fetch() 对 API 调用进行单元测试
使用 Jest 运行 testing-library/react-native 时 RNEncryptedStorage 未定义
React-Native 应用程序的 Jest 测试 Animated.View
react-native, jest, ts-jest: ReferenceError: React is not defined
如何使用 jest+enzyme 在 react-native 中选择一个元素(文本、视图)(主要是当文本/视图嵌套在组件的深处时)?