开玩笑+反应导航未定位路线/参数

Bli*_*kin 2 javascript jestjs react-native react-navigation react-native-testing-library

我正在尝试使用反应导航为应用程序编写测试,但遇到了正确读取路线和参数的问题。

我收到一个错误

类型错误:无法读取未定义的属性“params”

const [leadId] = useState(route.params.leadId);

我的组件看起来像

export default function AComponent() {
  const route = useRoute();
  const navigation = useNavigation();
  const dispatch = useDispatch();
  const [leadId] = useState(route.params.leadId);
}
Run Code Online (Sandbox Code Playgroud)

我已尝试遵循https://callstack.github.io/react-native-testing-library/docs/react-navigation/Warning: React.createElement: type is invalid但在包装组件时收到了。

我的测试看起来像

import React from 'react';
import { Provider } from 'react-redux';
import { NavigationContainer } from '@react-navigation/native';
import { render, fireEvent, cleanup } from 'react-native-testing-library';
import configureMockStore from 'redux-mock-store';

import AComponent from 'components/contact/AComponent';

const mockStore = configureMockStore([]);

describe('<AComponent />', () => {
  let getByTestId, store;

  beforeEach(() => {
    store = mockStore({});

    ({ getByTestId } = render(
      <Provider store={store}>
        <AComponent />
      </Provider>
    ));
  });
});
Run Code Online (Sandbox Code Playgroud)

我的模拟是

jest.mock('@react-navigation/native', () => {
  return {
    useNavigation: () => ({ goBack: jest.fn() }),
    useRoute: jest.fn(),
  };
});
Run Code Online (Sandbox Code Playgroud)

我不确定我是否错误地包装了组件,或者是否缺少其他内容。

任何想法或帮助将不胜感激。

谢谢。

小智 5

嘿,我刚刚自己解决了这个问题,这是我的解决方案

改变

jest.mock('@react-navigation/native', () => {
  return {
    useNavigation: () => ({ goBack: jest.fn() }),
    useRoute: jest.fn(),
  };
});
Run Code Online (Sandbox Code Playgroud)

jest.mock('@react-navigation/native', () => ({
  ...jest.requireActual('@react-navigation/native'),
  useNavigation: () => ({ goBack: jest.fn() }),
  useRoute: () => ({
    params: {
      <yourParamName>: '<paramValue>',
      <yourParamName2>: '<paramValue2>',
      etc...
    }
  }),
}));
Run Code Online (Sandbox Code Playgroud)

就我而言,我将此代码块放入 setup.ts 文件中,然后在 package.json 内的笑话配置中指向它。

例子

"setupFiles": [
  "./node_modules/react-native-gesture-handler/jestSetup.js",
  "./jest/setup.ts"
]
Run Code Online (Sandbox Code Playgroud)

然后在测试本身

const navigation = { navigate: jest.fn() };
const { getByTestId, getByText, queryByTestId } = render(<App navigation={navigation}/>);
Run Code Online (Sandbox Code Playgroud)