React native jest/react本机:替换/取消绑定Linking.catch

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

测试以下react本机代码时遇到问题

我想做的是用我的模拟代码替换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' }
      ]
    )
  };

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(也可以修改它以返回承诺),但在测试代码中首先要做的是(在调用您正在测试的代码之前)我认为第一种解决方案更简洁,但两者都是有效的