测试一个在React Native中带开玩笑的对象上调用的函数



edit

当前示例,

  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();
  });

错误

期望(jest.fn())。 被称为。

问题

我正在使用Jest&amp;Enzyme测试用React Native制造的类。该类具有其中的一个函数,当开火时使用链接库来调用canOpenUrlopenUrl。我可以在已安装的组件上模拟点击事件,但是我很难知道我可以实际测试多少。

我的目标是检查Linking.canOpenUrl是否启动了。

exmaple

组件内的功能看起来像这样,

  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:无法读取未定义的

的属性'_ismockFunction'

当前代码试图检查此功能是否已释放。使用模拟方法单击的父函数内部,

  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的正确方法是什么?

(因为开玩笑19.0.0 )

您可以使用jest.spyOn()

(1)告诉玩笑在模块方法上监视:

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

(2)完成了所有您需要测试的一切后,检查间谍:

expect(spy).toHaveBeenCalled();

(3)清理并停止间谍模块方法

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

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

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

函数传递给模拟的位置将是您在调用时要做的任何方法。

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


使用您的模块方法的实际实现(异步)时,在您测试时可能无法解决承诺。您需要在做出任何断言之前确保在方法实施中解决任何承诺。

一种处理此问题的方法是使用异步/等待,例如:

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

另一个选项是使用expect().resolves,自Jest 20.0.0以来可用,在该参数期望()在对该值提出主张之前,请在参数期望()中等待某些承诺。

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

我以最简单的方式完成了:

Spep to Spy:

  1. 使用开玩笑
  2. 制作原始功能的间谍对象
  3. 使用/没有参数的原始函数调用原始功能
  4. 主张应用有效参数调用的函数
  5. 重置模拟
  6. 还原模拟

这是示例示例

defaultbrowser.ts 是实际的类。

import { Linking } from 'react-native';
export const openDefaultBrowser = async url => {
  if (await Linking.canOpenURL(url)) {
    Linking.openURL(url);
  }
};

defaultbrowser.test.ts 是测试用例类。

import { openDefaultBrowser } from '../DefaultBrowser';
import { Linking } from 'react-native';
describe('openDefaultBrowser with validate and open url', () => {
  it('validate url', async () => {
    const spy = jest.spyOn(Linking, 'canOpenURL');
    openDefaultBrowser('https://www.google.com');
    expect(spy).toBeCalledWith('https://www.google.com');
    spy.mockReset();
    spy.mockRestore();
  });
  it('open url', async () => {
    const spy = jest.spyOn(Linking, 'openURL');
    openDefaultBrowser('https://www.google.com');
    expect(spy).toBeCalledWith('https://www.google.com');
    spy.mockReset();
    spy.mockRestore();
  });
});

希望这对您有帮助。

  it('open url', async () => {
    jest.spyOn(Linking, 'canOpenURL')
    const spy = jest.spyOn(Linking, 'openURL')
    openURL(sitePath)
    await waitFor(() => {
      expect(spy).toHaveBeenCalledWith(sitePath)
    })
    spy.mockReset()
    spy.mockRestore()
  })

相关内容

  • 没有找到相关文章

最新更新