React native Jest Redux Persist:TypeError:无法读取属性';捕捉';在WriteState未定义的

React native Jest Redux Persist:TypeError:无法读取属性';捕捉';在WriteState未定义的,react-native,jestjs,redux-persist,react-native-testing-library,React Native,Jestjs,Redux Persist,React Native Testing Library,我正试图用Jest和Typescript测试我的登录屏幕。我使用redux和redux persist进行存储,并将存储设置为使用AsyncStorage作为配置的一部分。我怀疑redux persist正在尝试在其使用的内置超时函数用完并尝试将存储设置为默认存储后重新水化?我得到以下错误: console.error redux-persist: rehydrate for "root" called after timeout. undefined undefined at _rehydra

我正试图用Jest和Typescript测试我的登录屏幕。我使用redux和redux persist进行存储,并将存储设置为使用AsyncStorage作为配置的一部分。我怀疑redux persist正在尝试在其使用的内置超时函数用完并尝试将存储设置为默认存储后重新水化?我得到以下错误:

console.error
redux-persist: rehydrate for "root" called after timeout. undefined
undefined
at _rehydrate (node_modules/redux-persist/lib/persistReducer.js:70:71)
at node_modules/redux-persist/lib/persistReducer.js:102:11
at tryCallOne (node_modules/promise/setimmediate/core.js:37:12)
at Immediate._onImmediate (node_modules/promise/setimmediate/core.js:123:15)
当前我的测试如下所示:

describe('Testing LoginScreen', () => {
  it('should render correctly', async () => {
    const { toJSON } = render(<MockedNavigator component={LoginScreen} />);
    await act(async () => await flushMicrotasksQueue());
    expect(toJSON()).toMatchSnapshot();
  });
});
type MockedNavigatorProps = {
  component: React.ComponentType<any>;
  params?: {};
};

const Stack = createStackNavigator();
const MockedNavigator = (props: MockedNavigatorProps) => {
  return (
    <MockedStorage>
      <NavigationContainer>
        <Stack.Navigator>
          <Stack.Screen
            name='MockedScreen'
            component={props.component}
            initialParams={props.params}
          />
        </Stack.Navigator>
      </NavigationContainer>
    </MockedStorage>
  );
};

export default MockedNavigator;
description('testingloginscreen',()=>{
它('应该正确呈现',异步()=>{
const{toJSON}=render();
wait-act(异步()=>wait-flushMicrotasksQueue());
expect(toJSON()).toMatchSnapshot();
});
});
我的MockNavigator如下所示:

describe('Testing LoginScreen', () => {
  it('should render correctly', async () => {
    const { toJSON } = render(<MockedNavigator component={LoginScreen} />);
    await act(async () => await flushMicrotasksQueue());
    expect(toJSON()).toMatchSnapshot();
  });
});
type MockedNavigatorProps = {
  component: React.ComponentType<any>;
  params?: {};
};

const Stack = createStackNavigator();
const MockedNavigator = (props: MockedNavigatorProps) => {
  return (
    <MockedStorage>
      <NavigationContainer>
        <Stack.Navigator>
          <Stack.Screen
            name='MockedScreen'
            component={props.component}
            initialParams={props.params}
          />
        </Stack.Navigator>
      </NavigationContainer>
    </MockedStorage>
  );
};

export default MockedNavigator;
type MockedNavigatorProps={
组件:React.ComponentType;
参数?:{};
};
const Stack=createStackNavigator();
常量MockedNavigator=(道具:MockedNavigatorProps)=>{
返回(
);
};
导出默认MockedNavigator;
以下是我创建存储的方式:

import 'react-native-gesture-handler';
import * as React from 'react';
import { Provider } from 'react-redux';
import { PersistGate } from 'redux-persist/integration/react';
import { store, persistor } from '../src/AppState/store';

type MockedStorageProps = {
  children: any;
};

const MockedStorage = (props: MockedStorageProps) => {
  return (
    <Provider store={store}>
      <PersistGate loading={null} persistor={persistor}>
        {props.children}
      </PersistGate>
    </Provider>
  );
};

export default MockedStorage;
导入“反应本机手势处理程序”;
从“React”导入*作为React;
从'react redux'导入{Provider};
从'redux persist/integration/react'导入{PersistGate};
从“../src/AppState/store”导入{store,persistor};
类型MockedStorageProps={
儿童:任何;
};
常量MockedStorage=(道具:MockedStorageProps)=>{
返回(
{props.children}
);
};
导出默认模拟存储;

我使用来自
redux persist
repo:上一个问题的建议解决了相同的错误

(它还有一个副作用,即在测试中避免从
redux logger
记录错误)

@火盆:

它基本上只是通过返回减缩器来绕过redux persist 不使用redux包直接保存


应用这个方法是可行的,但我最终遇到了一个新问题,我的所有渲染都是空的。这是因为传入PersistGate的null可以通过添加
jest.mock('redux-persist/integration/react',()=>({PersistGate:(props:any)=>props.children,})在测试中修复这两项都到位后,我的测试运行良好。