diff --git a/packages/react-navigation/src/navigators/__tests__/NestedNavigator-test.js b/packages/react-navigation/src/navigators/__tests__/NestedNavigator-test.js new file mode 100644 index 00000000..9fb3ef29 --- /dev/null +++ b/packages/react-navigation/src/navigators/__tests__/NestedNavigator-test.js @@ -0,0 +1,40 @@ +import React from 'react'; +import renderer from 'react-test-renderer'; +import StackNavigator from '../createStackNavigator'; + +const SubNavigator = StackNavigator({ + Home: { + screen: () => null, + }, +}); + +const NavNestedDirect = StackNavigator({ + Sub: { + screen: SubNavigator, + }, +}); + +const NavNestedIndirect = StackNavigator({ + Sub: { + // eslint-disable-next-line react/display-name + screen: props => , + }, +}); + +/* Prevent React error boundaries from swallowing the errors */ +NavNestedIndirect.prototype.componentDidCatch = null; +SubNavigator.prototype.componentDidCatch = null; + +describe('Nested navigators', () => { + it('renders succesfully as direct child', () => { + const rendered = renderer.create().toJSON(); + expect(rendered).toMatchSnapshot(); + }); + + it('throw when trying to pass navigation prop', () => { + const tryRender = () => { + renderer.create(); + }; + expect(tryRender).toThrowErrorMatchingSnapshot(); + }); +}); diff --git a/packages/react-navigation/src/navigators/__tests__/__snapshots__/NestedNavigator-test.js.snap b/packages/react-navigation/src/navigators/__tests__/__snapshots__/NestedNavigator-test.js.snap new file mode 100644 index 00000000..0eef7f36 --- /dev/null +++ b/packages/react-navigation/src/navigators/__tests__/__snapshots__/NestedNavigator-test.js.snap @@ -0,0 +1,359 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Nested navigators renders succesfully as direct child 1`] = ` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`Nested navigators throw when trying to pass navigation prop 1`] = `"No \\"routes\\" found in navigation state. Did you try to pass the navigation prop of a React component to a Navigator child? See https://reactnavigation.org/docs/en/custom-navigators.html#navigator-navigation-prop"`; diff --git a/packages/react-navigation/src/navigators/createNavigator.js b/packages/react-navigation/src/navigators/createNavigator.js index ab62fc87..a54416d1 100644 --- a/packages/react-navigation/src/navigators/createNavigator.js +++ b/packages/react-navigation/src/navigators/createNavigator.js @@ -22,9 +22,15 @@ function createNavigator(NavigatorView, router, navigationConfig) { const { navigation, screenProps } = nextProps; const { dispatch, state, addListener } = navigation; const { routes } = state; + if (typeof routes === 'undefined') { + throw new TypeError( + 'No "routes" found in navigation state. Did you try to pass the navigation prop of a React component to a Navigator child? See https://reactnavigation.org/docs/en/custom-navigators.html#navigator-navigation-prop' + ); + } const descriptors = { ...prevState.descriptors }; const childEventSubscribers = { ...prevState.childEventSubscribers }; + routes.forEach(route => { if ( !descriptors[route.key] ||