【问题标题】:How to mock Picker and Picker.Item with jest in React-Native?如何在 React-Native 中开玩笑地模拟 Picker 和 Picker.Item?
【发布时间】:2023-03-27 03:47:02
【问题描述】:

我正在尝试对这段代码的 sn-p 进行快照测试:

import React, { Component } from 'react';
import {
  Picker,
} from 'react-native';

export default class TestComponent extends Component {

  render() {
    return (
      <Picker
        selectedValue={this.props.asset.type}
        onValueChange={this.props.onTypeChange}>
        <Picker.Item label="Type of asset" value="default" />
        <Picker.Item label="Car" value="car" />
        <Picker.Item label="Boat" value="boat" />
        <Picker.Item label="Ship" value="ship" />
      </Picker>
    );
  }
}

我的测试现在看起来像这样:

import 'react-native';
import React from 'react';
import TestComponent from './TestComponent';

import renderer from 'react-test-renderer';

describe('TestComponent', () => {
  const asset = {
    type: 'car',
  }
  it('renders correctly', () => {
    const tree = renderer.create(
      <TestComponent 
        asset={asset} />
    ).toJSON();
    expect(tree).toMatchSnapshot();
  });
})

我的问题是:

TypeError: Cannot read property '_tag' of undefined

我认为我应该根据this issue来模拟它

我尝试过简单地添加:

jest.mock('Picker', () => 'Picker')

但它仍然会引发错误,因为 Picker.Item 仍然没有被模拟

Invariant Violation: Element type is invalid: expected a string (for built-
in components) or a class/function (for composite components) 
but got: undefined. Check the render method of `TestComponent`.

我尝试过的其他变体无济于事:

jest.mock('Picker', () => {return {Item: 'Item'}});
----------------------------------------------------
class Picker{
  Item = 'PickerItem'
}
jest.mock('Picker', () => {
  return Picker;
});

【问题讨论】:

    标签: unit-testing react-native mocking jestjs


    【解决方案1】:

    还创建了github issue,这是一个有效的答案:

    jest.mock('Picker', () => {
      const Picker = class extends Component {
        static Item = props => React.createElement('Item', props, props.children);
        static propTypes = { children: React.PropTypes.any };
    
        render() {
          return React.createElement('Picker', this.props, this.props.children);
        }
      }
      return Picker;
    })
    

    【讨论】:

    【解决方案2】:

    对于 Expo v39,我可以通过将以下模拟添加到我的测试/设置文件中来测试 @react-native-community/picker

    jest.mock('@react-native-community/picker', () => {
      const React = require('React')
      const RealComponent = jest.requireActual('@react-native-community/picker')
    
      class Picker extends React.Component {
        static Item = (props: { children: never }) => {
          return React.createElement('Item', props, props.children)
        }
    
        render () {
          return React.createElement('Picker', this.props, this.props.children)
        }
      }
    
      Picker.propTypes = RealComponent.propTypes
      return {
        Picker
      }
    })
    

    请注意,@react-native-community/picker 现在是 react-native-picker/picker

    https://jestjs.io/docs/en/tutorial-react-native#tips

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-27
      • 2017-12-14
      • 2020-11-18
      • 1970-01-01
      • 1970-01-01
      • 2017-07-01
      • 1970-01-01
      • 2020-08-20
      相关资源
      最近更新 更多