React Native 在单元测试中覆盖匿名函数参数

roqulrg3  于 2022-11-30  发布在  React
关注(0)|答案(2)|浏览(124)

在创建对象时,我在代码中有多种情况需要将函数作为参数传递(如onPress中的情况):

<Touchable
  onPress={() => Linking.openURL(formatUrl(url))} 
  noContainer={true}>      
    {children}
</Touchable>

归根结底,这是一个更大组件中的一个片段,因为它实际上不是组件的一个方法,所以我对在这里测试它并不特别感兴趣--如果需要的话,它将作为另一个组件的一部分进行测试。x1c 0d1x然而,代码覆盖率报告返回了一个指示,表明该函数未被覆盖。
是否有一种方法可以满足这种覆盖--要么测试这个函数,要么忽略所有以这种方式传递的函数(匿名地,作为参数)?

rur96b6h

rur96b6h1#

假设您正在使用Jest,您可以设置Jest mock来调用它接收到的参数,因此:

const componentProps = {
  onPress: jest.fn(func => func());
}

因此,在本例中,模拟的onPress函数将接收匿名函数并调用它。覆盖率将显示匿名函数被调用。
希望对你有帮助:)

elcex8rz

elcex8rz2#

首先,我想建议不要从覆盖范围中免除代码行,特别是如果你是被支付来编写代码和单元测试它的话。
我发现有一件事是有效的,那就是编写一个void函数,它用你想要的参数调用你的函数。
如果您有:

onClick={ () => function(argument) }

而Jest没有覆盖它,试试看:

const functionWithArgs = () => function(argument)
onClick={functionWithArgs}

我经常用这个来表示情态动词:

const [isModalOpen, setModalOpen] = React.useState(false)
const toggleModal = () => setModalOpen(!isModalOpen)
onClick={toggleModal}

但同样的原理也可以应用到一个复杂得多的函数上。而且它起作用了!

相关问题