Skip to content

Test fails when using react-navigation container and react-redux provider together #1118

Closed
@firasrg

Description

@firasrg

Hi! I have a weird annoying issue while I try to wrap my component (to render), inside redux provider + navigation container, following the examples such as the one in this Github repo, as for the other example from redux-toolkit repo.

👉 If I combine <NavigationContainer/> with <Provider/> as follows:

    const ComponentToRender = () => (
        <Provider store={mockStore}>
          <NavigationContainer>
             <MyScreenToRender />
          </NavigationContainer>
        </Provider>
    )

I get the following errors:

ERROR 1 🐞:

 console.error
    Warning: An update to MyScreenToRender inside a test was not wrapped in act(...).
    
    When testing, code that causes React state updates should be wrapped into act(...):
    
    act(() => {
      /* fire events that update state */
    });
    /* assert on the output */
    
    This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act

ERROR 2 🐞:

WARN - IDE integration: Couldn't find a navigation context. Have you wrapped your app with 'NavigationContainer'? See https://reactnavigation.org/docs/getting-started for setup instructions.
Error: Couldn't find a navigation context. Have you wrapped your app with 'NavigationContainer'? See https://reactnavigation.org/docs/getting-started for setup instructions.
    at Object.get getIsInitial [as getIsInitial] (...\node_modules\@react-navigation\core\lib\commonjs\NavigationStateContext.tsx:37:11)

This is my test file code :

import {
  screen,
  waitFor,
  render,
} from "@testing-library/react-native";
import { mockStore } from "@app/tests/mock-redux/mockStore";
import { NavigationContainer } from "@react-navigation/native";
import { Provider } from "react-redux";
import apiInstance from "../../api/myApi";
import MyComponentToRender from "../../view";

jest.mock('react-i18next', () => ({
  useTranslation: () => {
    return {
      t: (str:string) => str,
      i18n: {
        changeLanguage: () => new Promise(() => {}),
      },
    };
  },
}));

jest.mock('react-native-reanimated', () => {
  const Reanimated = require('react-native-reanimated/mock');

  Reanimated.default.call = () => {};

  return Reanimated;
});

// Reset RTK API state after each test case
afterEach(() => {
    // following a recommendation from Redux team
    // the RTKQ state, must be reset visit: https://stackoverflow.com/a/69310703/10000150
    mockStore.dispatch(apiInstance.util.resetApiState())
})

// TODO
describe('list screen tests', () => {

  // scenario one : initialize screen
  it('list initialization', async () => {
    
    const ToRender = () => (
        <Provider store={mockStore}>
          <NavigationContainer>
            <MyComponentToRender />
          </NavigationContainer>
        </Provider>
    )
    
    render(<ToRender />);
    
    const screenGlobalLoading = screen.getByText(/loading/, {exact: false});

    expect(screenGlobalLoading).toEqual("Loaading...");
    
    await waitFor(() => {
      expect(screenGlobalLoading).toBeFalsy();
    });
  });
});

I use the following techs:

Tech Version
Expo 45.0.0
React Native v0.68.2
Redux-Toolkit v1.8.2
React Redux v8.0.2
RN Testing Library v10.1.1
react-navigation/native 6.0.2

I can give you further information if needed, please help 🙏

Originally posted by @firas1220 in #1100 (comment)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions