MockedProvider от Apollo не предоставляет клиента для компонентов, упакованных в Apollo - PullRequest
1 голос
/ 28 января 2020

При тестировании компонента, завернутого в Apollo, я использую MockedProvider от Apollo, как указано в документации Apollo, но когда энзим пытается визуализировать этот компонент, средство визуализации не находит client, которое должен был предоставить MockedProvider.

У меня есть компонент, который использует useQuery в контексте Apollo.

export const QUERY = gql`{ value }`
export const Component = withApollo(({ client ) => {
    const { data } = useQuery(QUERY)
    return <p>{ data }</p>
})

Поэтому я хочу проверить его:

describe('Component', () => {
    const mocks = [{
        request: { query: QUERY },
        result: { data: 42 }
    }]
    const WrappingComponent = ({ children }) => <MockedProvider mocks={ mocks } addTypename={ false }>
        { children }
    </MockedProvider>
    WrappingComponent.propTypes = {
        children: PropTypes.any
    }
    const component = shallow(<Component />, { wrappingComponent: WrappingComponent })

    it('matches the snapshot', () => {
        expect(enzymeToJson(component)).toMatchSnapshot()
    })
}

В этом случае снимок поворачивается

exports[`CruxProductSetup matches the snapshot 1`] = `
<ApolloConsumer>
  <Component />
</ApolloConsumer>
`;

Не мой компонент, поэтому я делаю трюк и пытаюсь проникнуть внутрь:

    const component = shallow(shallow(<Component />, { wrappingComponent: WrappingComponent }).get(0))

И снимок:

exports[`Component matches the snapshot 1`] = `
<ContextConsumer>
  <Component />
</ContextConsumer>
`;

Все еще не полезно. Мой компонент еще не визуализирован. Я делаю трюк еще раз:

const component = shallow(shallow(shallow(<Component />, { wrappingComponent: WrappingComponent }).get(0)).get(0))

И перед тем, как сделать снимок, фермент выдает эту ошибку:

 FAIL  Component/__tests__/index.js
  Component
    ✕ encountered a declaration exception (75ms)

  ● Component › encountered a declaration exception

    Invariant Violation: Could not find "client" in the context of ApolloConsumer. Wrap the root component in an <ApolloProvider>.

      85 |     })
      86 |
    > 87 |     const component = shallow(shallow(shallow(<Component />, { wrappingComponent: WrappingComponent }).get(0)).get(0))
      88 |     // const component = shallow(shallow(shallow(<Component />, { wrappingComponent: WrappingComponent }).get(0)).get(0))
      89 |     // const component = shallow(shallow(shallow(<CruxProductSetup summaryPanel={ null } />, { wrappingComponent: WrappingComponent }).get(0)).get(0))
      90 |

      at new InvariantError (node_modules/ts-invariant/lib/invariant.esm.js:12:28)
      at invariant (node_modules/ts-invariant/lib/invariant.esm.js:24:15)
      at Object.children (node_modules/@apollo/react-common/lib/react-common.cjs.js:55:132)
      at Object.type (node_modules/enzyme-adapter-react-16/src/ReactSixteenAdapter.js:612:30)
      at ReactShallowRenderer.render (node_modules/enzyme-adapter-react-16/node_modules/react-test-renderer/cjs/react-test-renderer-shallow.development.js:104:34)
      at node_modules/enzyme-adapter-react-16/src/ReactSixteenAdapter.js:615:53
      at withSetStateAllowed (node_modules/enzyme-adapter-utils/src/Utils.js:99:18)
      at Object.render (node_modules/enzyme-adapter-react-16/src/ReactSixteenAdapter.js:615:18)
      at new ShallowWrapper (node_modules/enzyme/src/ShallowWrapper.js:411:22)
      at shallow (node_modules/enzyme/src/shallow.js:10:10)
      at Suite.<anonymous> (Component/__tests__/index.js:87:23)
      at Object.<anonymous> (Component/__tests__/index.js:61:1)

"Could not find "client" in the context of ApolloConsumer. Wrap the root component in an <ApolloProvider>"? Я думал, что это то, что MockedProvider делает.

Мои зависимости:

@apollo/react-testing: 3.1.3
enzyme: 3.11.0
graphql-tag: 2.10.1
jest: 22.4.4
react: 16.12.0
react-apollo: 3.1.3

1 Ответ

0 голосов
/ 20 апреля 2020

У меня была такая же проблема. Оказывается, установив react-apollo и @apollo/react-hooks вызывал его. Удалено react-apollo dependecy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...