如何模拟 useApolloClient 钩子?

Posted

技术标签:

【中文标题】如何模拟 useApolloClient 钩子?【英文标题】:How to mock the useApolloClient hook? 【发布时间】:2021-11-24 11:59:39 【问题描述】:

Apollo Client 提供了this doc 用于测试带有MockedProvider 的API,但它似乎没有模拟useApolloClient 钩子。当我将 MockedProvider 与我的功能组件一起使用并运行测试时,即使我在安装时添加了 MockedProvider,我也会收到此错误:

Invariant Violation: No Apollo Client instance can be found. Please ensure that you have called `ApolloProvider` higher up in your tree.

      72 |   );
      73 |
    > 74 |   const makeCall = useApolloClient();

这就是我安装它的方式:

const mockResponses = [];
const wrapper = mount(
    <MockedProvider mocks=mockResponses addTypename=false>
      <Provider store=store>
          <PriceComponent
            ...someProps
          />
      </Provider>
    </MockedProvider>
  );

有什么想法可能会出错吗?

【问题讨论】:

【参考方案1】:

我建议您为此创建一个包装器,以便在需要时重复使用它。

import  MockedProvider, MockedResponse  from "@apollo/client/testing";
import  render, RenderResult  from "@testing-library/react";
import  FC, ReactElement  from "react";

function renderWithApolloProvider(
  ui: ReactElement,
  mocks: MockedResponse<Record<string, any>>[] = [],
): RenderResult 
  const Wrapper: FC = ( children ) => 
      return (
          <MockedProvider mocks=mocks>
              children
          </MockedProvider>
      );
  ;

  return render(ui,  wrapper: Wrapper );
;

然后你可以像这样在你的测试中使用它:

const mocks = [
  // Your GraphQL mocks
];

renderWithApolloProvider(
  <PriceComponent
     ...someProps
  />,
  mocks
);

我在上面的例子中使用了 react 测试库。

您似乎正在使用enzyme 来测试您的组件,所以试试这个

function mountWithApolloProvider(
    Component,
    mocks = [],
) 
  const wrapper = mount(
     <Provider store=store>
       <MockedProvider mocks=mocks addTypename=false>
          <Component />
       </MockedProvider>
     </Provider>
  )
  return wrapper;

用法:

const mocks = [
  // Your GraphQL mocks
];

renderWithApolloProvider(
  PriceComponent,
  mocks
);

【讨论】:

以上是关于如何模拟 useApolloClient 钩子?的主要内容,如果未能解决你的问题,请参考以下文章

如何测试/模拟反应钩子?

如何模拟反应自定义钩子返回值?

如何在玩笑中模拟/监视 useState 钩子?

如何使用 Mock Service Worker 在自定义钩子中模拟获取?

如何编写依赖于 React 中 useState 钩子的条件渲染组件的测试?

用 Jest 模拟 React 自定义钩子