javascript - 使用react-relay进行测试时组件未渲染

标签 javascript reactjs react-testing-library react-relay

我正在尝试使用 React Relay 和 React 测试库测试组件

// @flow
import { Suspense } from 'react';
import {
  RelayEnvironmentProvider,
  useLazyLoadQuery,
  graphql,
} from 'react-relay/hooks';
import { createMockEnvironment, MockPayloadGenerator } from 'relay-test-utils';
import { render, cleanup, screen, act } from '@testing-library/react';
import Banner from './Banner';
jest.mock('react-router-dom', () => ({
  useLocation: jest.fn(() => ({
    pathname: 'some-path',
  })),
}));
describe('<Banner>', () => {
  let mockEnvironment;
  const defaultMockResolver = {
    // We do not want a consistent return in this case since we want the default MockPayloadGenerator behavior for most fields
    // See https://relay.dev/docs/en/testing-relay-components#mock-resolver-context
    // eslint-disable-next-line consistent-return
    String(context) {
      if (context.name === 'viewer') {
        return {id: 111 };
      }
    },
  };
  beforeEach(() => {
    mockEnvironment = createMockEnvironment();
  });
  afterEach(cleanup);
  it('renders - snapshot', () => {
    mockEnvironment = createMockEnvironment();
    const RelayComponent = () => {
      const data = useLazyLoadQuery(
        graphql`
          query BannerTestQuery @relay_test_operation {
            viewer {
              # Spread the fragment you want to test here
              ...Banner_viewer
            }
          }
        `,
        {},
      );
      return <Banner viewer={data.myData} />;
    };
    render(
      <RelayEnvironmentProvider environment={mockEnvironment}>
        <Suspense fallback="Loading...">
          <RelayComponent />
        </Suspense>
      </RelayEnvironmentProvider>,
    );
    // expect(container.firstChild).toMatchSnapshot();
    act(() => {
      mockEnvironment.mock.resolveMostRecentOperation(operation =>
        MockPayloadGenerator.generate(operation, defaultMockResolver),
      );
    });
    screen.debug();
  });
});

但是,测试不会加载带有模拟数据的组件,而仅返回 Suspense 回退

最佳答案

这实际上有效:https://githubmemory.com/repo/facebook/relay/issues/3276

在渲染组件之前调用queueOperationResolver非常重要。

关于javascript - 使用react-relay进行测试时组件未渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66896034/

相关文章:

reactjs - 导航到新页面后停止 Reach Router 向下滚动页面

reactjs - 为什么 React-Testing-Library/Jest 向后接收 DOM 输入?

javascript - react-native-testing-library 和 styled-components 无法访问 Prop

javascript - 测试使用 useEffect Hook 和 apollo 的自定义上下文 Hook

javascript - 如何将正文中的数字替换为波斯数字?

javascript - 如何让for循环等到异步调用成功后再继续

javascript - 根据输入元素范围更改 div-element

javascript - 为什么 React 告诉我 this.handleClick 不是一个函数?

javascript - 在 React.js 中使用 SVG 过滤器属性

javascript - 购物指令范围问题