测试以下反应原生代码时遇到问题。
我想做的是用我的模拟代码替换 Linking.openURL 和 Linking.OpenURL.catch。
我正在为Linking.openURL做,如下所示:
jest.mock('Linking', () => {
return {
openURL: jest.fn()
}
})
Linking.openURL.mockImplementation(() => true)
但我不断得到:
TypeError: _reactNative.Linking.openURL(...).catch is not a function
知道如何替换/禁用 catch 子句吗?
这是我的代码:
func1() {
switch (this.props.a) {
case 'NO':
this.alertMessage(`msg`)
break
case 'YES':
default:
Linking.openURL(url1).catch(err => { Linking.openURL(url2)
})
}
}
alertMessage = (title) => {
Alert.alert(
title,
'',
[
{ text: 'OK',
onPress: () => {
Linking.openURL(url1).catch(err => {
Linking.openURL(url2)
})
} },
{ text: 'Cancel',
onPress: () => {
this.setState({
stateVar1: true
})
},
style: 'cancel' }
]
)
};
万一有人收到消息错误Cannot find module 'Linking' from
只需将Linking
替换为react-native/Libraries/Linking/Linking
即可。
所以你的代码应该看起来像这样:
jest.mock('react-native/Libraries/Linking/Linking', () => ({
openURL: jest.fn(() => Promise.reject('some error reason'))
}));
Linking.openURL
返回一个Promise
,所以模拟函数也需要返回一个。如果你想测试catch
上发生了什么,你可以reject
承诺(或者如果你不想调用捕获,resolve
它)。
下面是一个拒绝承诺的模拟示例:
jest.mock('Linking', () => ({
openURL: jest.fn(() => Promise.reject('some error reason'))
}));