Jest.js 监视从第三方库钩子返回的函数

iih3973s  于 6个月前  发布在  Jest
关注(0)|答案(2)|浏览(83)

我无法找出hot来监视React navigationv5中useNavigation钩子返回的navigate函数。
我有一个简单的Link组件:

const Link = props => {
  const { to, children, ...restProps } = props;
  const navigation = useNavigation();

  const handlePress = useCallback(() => navigation.navigate(to), [navigation, to]);

  return (
    <TouchableOpacity testID="link" onPress={handlePress}>
      <Text
        {...restProps}
      >
        {children}
      </Text>
    </TouchableOpacity>
  );
};

字符串
和相应的测试:

jest.mock('@react-navigation/native', () => ({
  ...jest.requireActual('@react-navigation/native'),
  useNavigation: () => ({
    navigate: jest.fn(() => 'mocked navigate'),
  }),
}));

import { useNavigation } from '@react-navigation/native';

const spy = jest.spyOn(useNavigation, 'navigate');

describe('<Link />', () => {
  it('navigates', () => {
    const link = render(<Link to="TestScreen">Test link</Link>);
    fireEvent.press(link.getByTestId('link'));

    expect(spy).toBeCalledTimes(1);
  })
});


当然这是行不通的,因为在const spy = jest.spyOn(useNavigation, 'navigate');中,navigate不是useNavigation的函数。但是我尝试了无数其他的可能性,我就是不知道如何做到这一点。
基本上,我试图做的是验证,当链接被按下,它调用预期的函数与预期的参数,我希望该函数被模拟出来。

hgb9j2n6

hgb9j2n61#

我知道我迟到了,但我有同样的问题,想知道什么时候导航功能被调用。
对于它,我这样模仿了这个函数,所以mockedNavigate将是一个jest函数,我可以稍后使用:

const mockedNavigate = jest.fn();

jest.mock('@react-navigation/native', () => {
  return {
    ...jest.requireActual('@react-navigation/native'),
    useNavigation: () => ({
      navigate: mockedNavigate,
    }),
  };
});

字符串
这让我可以稍后使用它,在这种情况下,你将不再需要间谍,这应该可以做到这一点:

expect(mockedNavigate).toHaveBeenCalledTimes(1);

ojsjcaue

ojsjcaue2#

你好,对于那些寻找vitest你可以使用它像:

const mockedNavigate = vi.fn();
vi.mock('react-router-dom', async () => {
    const reactRouterDom = await vi.importActual('react-router-dom') as object;
    return {
        ...reactRouterDom,
        useNavigation: () => (mockedNavigate),
    };
});

字符串
那么expect就像:

expect(mockedNavigate).toHaveBeenCalledTimes(1);

相关问题