react-native - 在 React Native 中使用 Jest 测试在对象上调用的函数

标签 react-native jestjs enzyme

编辑

当前示例,

  it('CALLED THE canOpenURL FUNCTION', () => {
    const wrapper = mount(<ResourceCardComponent {...mockProps} />);
    const canOpenURLSpy = jest.spyOn(Linking, 'canOpenURL');
    wrapper.find('TouchableOpacity').simulate('click');
    expect(canOpenURLSpy).toHaveBeenCalled();
    canOpenURLSpy.mockReset();
    canOpenURLSpy.mockRestore();
  });

错误

expect(jest.fn()).toHaveBeenCalled() Expected mock function to have been called.

问题

我正在使用 JestEnzyme 来测试用 React Native 制作的类。此类内部有一个函数,当被触发时使用链接库调用 canOpenUrlopenUrl。我可以在安装的组件上模拟点击事件,但我不知道我可以实际测试多少。

我的目标是检查 Linking.canOpenUrl 是否触发。

例子

组件内部的函数是这样的,

  onPressLink() {
    console.log('HEY THIS FUNCTION FIRED WOOT WOOT');
    Linking.canOpenURL(this.props.url).then((supported) => {
      if (supported) {
        Linking.openURL(this.props.url);
      }
    });
  }

我可以像这样模拟发射,

describe('onPressLink has been called!', () => {
  it('It clicks the mock function onPressLink!', (done) => {
    const wrapper = mount(<MyComponent {...mockProps} />);
    const onPressLink = jest.fn();
    const a = new onPressLink();
    wrapper.find('TouchableOpacity').first().simulate('click');
    expect(onPressLink).toHaveBeenCalled();
    done();
  });
});

现在确实可行,但我的目标是使用类似这样的东西,

expect(Linking.canOpenUrl).toHaveBeenCalled();

但我一直收到这个错误,

TypeError: Cannot read property '_isMockFunction' of undefined

当前代码正在尝试检查此函数是否曾被触发。在用模拟方法点击的父函数里面,

  it('calls canOpenURL', () => {
    const wrapper = mount(<MyComponent {...mockProps} />);
    const canOpenURL = jest.spyOn(wrapper.instance, 'onPressLink');
    wrapper.find('TouchableOpacity').simulate('click');
    expect('Linking.canOpenUrl').toHaveBeenCalled();
  });

问题

检查 Linking.canOpenURL 在其父函数执行时是否被触发的正确方法是什么?

最佳答案

(自 Jest 19.0.0+ 起)

您可以使用 jest.spyOn() 监视链接模块方法。

(1) 让jest监视模块方法:

const spy = jest.spyOn(Linking, 'canOpenURL');

(2) 完成所有测试后,检查 spy :

expect(spy).toHaveBeenCalled();

(3) 清理并停止监视模块方法

spy.mockReset();
spy.mockRestore();

如果您不希望测试使用方法的实际实现,您可以像这样伪造它们:

jest.spyOn(Linking, 'canOpenURL').mockImplementation(() => Promise.resolve());

传递给 mockImplementation 的函数将是您希望该方法在调用时执行的任何操作。

引用 https://facebook.github.io/jest/docs/en/jest-object.html#jestspyonobject-methodname


当使用异步的模块方法的实际实现时,promise 可能在您测试它时尚未解决。在对其进行任何断言之前,您需要确保在您的方法实现中解决了任何 promise 。

处理此问题的一种方法是使用 async/await,如下所示:

it('...', async () => {
  // Wait for promise to resolve before moving on
  await wrapper.instance().onPressLink();

  // make your assertions
  expect(...);
});

另一种选择是使用 expect().resolvesavailable since Jest 20.0.0 ,在对那个值做出断言之前,你等待 expect() 的参数中的一些 promise 用一个值来解析。

expect(somePromiseThatEventuallyResolvesWithValue).resolves.toBe(Value);

关于react-native - 在 React Native 中使用 Jest 测试在对象上调用的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47802886/

相关文章:

reactjs - 在选项卡导航器中调用堆栈函数会导致应用程序崩溃

react-native - react 导航选项卡屏幕图标颜色 Prop 类型

Angular + Jest : Can't resolve all parameters for AppComponent: (? )

reactjs - waitFor 不等待回调被调用

reactjs - 模拟 ('change' 之后状态未更新

reactjs - 使用 enzyme 测试 react 确认窗口

android - WebView 的 React Native 地理定位

react-native - 来自打包程序的 native react 中的条目文件错误

node.js - 用 Jest 模拟间接依赖

reactjs - 如何为使用 Table 组件 Material UI 的 Component 编写测试?