react-native - 中继现代 : how to mock relay for unit testing

标签 react-native relaymodern

我正在尝试测试 react 中继现代容器,但遇到了这个问题。

TypeError: Cannot read property 'environment' of undefined

下面是测试代码:
test('render component', () => {
  const tree = renderer.create(
    <User />,
  ).toJSON();

  expect(tree).toMatchSnapshot();
});

最佳答案

将以下内容添加到 __mocks__文件夹。然后在测试中添加 jest.mock('react-relay');到需要中继的单元测试。这将模拟中继并只留下要测试的组件。

import React from 'react';
import PropTypes from 'prop-types';

const relayMock = jest.genMockFromModule('react-relay');

const relayChildContextTypes = {
  relay: PropTypes.object,
};

const relayEnvironment = {
  lookup: jest.fn(),
};

const relayContext = {
  relay: {
    environment: relayEnvironment,
    variables: {},
  },
};

const relayFragmentProps = {
  relay: {
    environment: relayEnvironment,
  },
};

const relayRefetchProps = {
  relay: {
    environment: relayEnvironment,
    refetch: jest.fn(),
  },
};

const relayPaginationProps = {
  relay: {
    environment: relayEnvironment,
    hasMore: jest.fn(),
    loadMore: jest.fn(),
    isLoading: jest.fn(),
  },
};

relayMock.__relayEnvironment = relayEnvironment;
relayMock.__relayFragmentProps = relayFragmentProps;
relayMock.__relayRefetchProps = relayRefetchProps;
relayMock.__relayPaginationProps = relayPaginationProps;

const makeRelayWrapper = (relayProps) => (
  (Comp) => {
    class HOC extends React.Component {
      getChildContext() {
        return relayContext;
      }

      render() {
        return <Comp {...this.props} {...relayProps}/>;
      }
    }

    HOC.childContextTypes = relayChildContextTypes;
    return HOC;
  }
);

relayMock.QueryRenderer = jest.fn(() => React.createElement('div', null, 'Test'));

relayMock.createFragmentContainer = makeRelayWrapper(relayFragmentProps);
relayMock.createRefetchContainer = makeRelayWrapper(relayRefetchProps);
relayMock.createPaginationContainer = makeRelayWrapper(relayPaginationProps);

module.exports = relayMock;

关于react-native - 中继现代 : how to mock relay for unit testing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45897457/

相关文章:

react-native - 使用 Command-R 在 iOS 模拟器中重新加载应用程序不起作用

javascript - 如何在 React Native 中切换状态

ios - 代码推送 : How to deploy to multiple build versions of the same deployment config?

javascript - Relay-Modern FragmentContainer 数据未填充

reactjs - 没有数据的中继容器

javascript - 如何使用 React Native 创建模态窗口?

javascript - 使用 useState 时如何减少 React 中的重复?

java - 使用 Relay Modern 和 GraphQL 上传文件

reactjs - `updater` 无法与 Relay Modern 配合使用,因为 `ConnectionHandler.getConnection()` 返回 `undefined`