React native jest/react本机:替换/取消绑定Linking.catch
测试以下react本机代码时遇到问题 我想做的是用我的模拟代码替换Linking.openURL和Linking.openURL.catch 我正在为Linking.openURL执行以下操作:React native jest/react本机:替换/取消绑定Linking.catch,react-native,jestjs,React Native,Jestjs,测试以下react本机代码时遇到问题 我想做的是用我的模拟代码替换Linking.openURL和Linking.openURL.catch 我正在为Linking.openURL执行以下操作: jest.mock('Linking', () => { return { openURL: jest.fn() } }) Linking.openURL.mockImplementation(() => true) 但我一直得到: Typ
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' }
]
)
};
Linking.openURL
返回一个Promise
,因此mock函数也需要返回一个。如果您想测试在catch
上发生了什么,您可以拒绝承诺(或者解决它,如果您不想调用catch)
以下是拒绝承诺的模拟示例:
jest.mock('Linking', () => ({
openURL: jest.fn(() => Promise.reject('some error reason'))
}));
Linking.openURL
返回一个Promise
,因此mock函数也需要返回一个。如果您想测试在catch
上发生了什么,您可以拒绝承诺(或者解决它,如果您不想调用catch)
以下是拒绝承诺的模拟示例:
jest.mock('Linking', () => ({
openURL: jest.fn(() => Promise.reject('some error reason'))
}));
以防万一有人收到错误消息,无法从
只需将链接
替换为react native/Libraries/Linking/Linking
因此,您的代码应该如下所示:
jest.mock('react-native/Libraries/Linking/Linking', () => ({
openURL: jest.fn(() => Promise.reject('some error reason'))
}));
以防万一有人收到错误消息,无法从
只需将链接
替换为react native/Libraries/Linking/Linking
因此,您的代码应该如下所示:
jest.mock('react-native/Libraries/Linking/Linking', () => ({
openURL: jest.fn(() => Promise.reject('some error reason'))
}));
谢谢@Artal,对于“Linking.openURL(url.catch(err=>{)”行,我仍然得到“TypeError:_reactNative.Linking.openURL(…).catch不是函数”这很奇怪。当使用你的mock时,我遇到了相同的错误,承诺解决了它。请确保你不要同时使用jest.mock和mockImplementation,因为它更改了以前的mock。你是对的。我的错…顺便说一句,如果我想同时定义resolve和reject,你知道我是如何做到的吗?选项1:创建2个描述部分(它们甚至可以在您的父描述部分中)然后您可以针对每种情况对其进行不同的模拟。选项2:像您那样使用mockImplementation(也可以修改它以返回承诺),但在测试代码中首先要做的是(在调用您正在测试的代码之前)我认为第一个解决方案更简洁,但都是有效的hanks@Artal,我仍然得到“TypeError:_reactNative.Linking.openURL(…).catch不是一个函数”作为“Linking.openURL(url).catch(err=>{”这很奇怪。当使用你的mock时,我遇到了相同的错误,承诺解决了它。请确保你不要同时使用jest.mock和mockImplementation,因为它更改了以前的mock。你是对的。我的错…顺便说一句,如果我想同时定义resolve和reject,你知道我是如何做到的吗?选项1:创建2个描述部分(它们甚至可以在您的父描述部分中)然后您可以针对每种情况对其进行不同的模拟。选项2:像您那样使用mockImplementation(也可以修改它以返回承诺),但在测试代码中首先要做的是(在调用您正在测试的代码之前)我认为第一种解决方案更简洁,但两者都是有效的