如何使用 Jest 和 Enzyme 测试 getDerivedStateFromProps

IT技术 javascript reactjs unit-testing jestjs enzyme
2021-04-27 01:16:13

我有这个使用getDerivedStateFromProps新生命周期的简单代码

static getDerivedStateFromProps(nextProps: Props, prevState: State) {
  if (nextProps.value !== prevState.value) {
    console.log('hello');
    return {
      value: nextProps.value
    };
  }

  return null;
}

这是测试:

it('should call getDerivedStateFromProps', () => {
  const instance = shallow(mockComponent());

  instance.setProps({ value: 'test2' });

  expect(instance.state.value).toEqual('test2');
});

但我有这个错误,但我知道这是因为 console.log() 调用。

Expected value to equal:
  "test2"
Received:
  undefined

我如何正确测试getDerivedStateFromProps

我正在使用:

react: 16.4
react-Dom: 16.4
enzyme-adapter-react-16: 1.1.1
react-test-renderer: 16.4.1
4个回答

它是一个没有依赖性的静态函数。我认为您可以像其他所有功能一样单独测试它:

const givenProps = {...};
const givenState = {...};
const result = MyComponent.getDerivedStateFromProps(givenProps, givenState);

expect(result).toEqual({
  ...
})

我认为这是一种有效的方法,因为不getDerivedStateFromProps应该包含任何副作用并且是纯的 - 这意味着 - 给定相同的输入它将产生相同的输出。并且因为组件的实例在这里没有相关性,所以创建一个只会测试内部的react。

这也类似于您如何测试 redux reducer。

根据我的经验,您不应该直接调用“getDerivedStateFromProps”函数来测试它。它是组件生命周期的一部分,因此您需要做的就是:

  1. 使用 state 中的值启动组件。
  2. 用新值更新props。
  3. 检查状态(因为它将被更新,因为“getDerivedStateFromProps”函数将被自动调用。

例如:

describe('getDerivedStateFromProps', () => {
        it('new value arrived from props and state is updated', () => {
            const newValue = 'NewVal';
            const wrapper = createAndMountComponent(params); // here initiate your component wrapper
            const instance = wrapper.instance();

            wrapper.setProps({ value: newValue });  // update props

            const { value, valueFromProps } = instance.state; // check if the value in state was updated
            expect(value).toEqual(newValue);
            expect(valueFromProps).toEqual(newValue);
        });
});

这足以测试“getDerivedStateFromProps”函数。当然,您不应忘记更新“getDerivedStateFromProps”函数中的值:

static getDerivedStateFromProps(props, state) {
    const { value } = props;
    const { valueFromProps } = state;

    if (value !== valueFromProps) {
        return {
            value,
            valueFromProps: value
        };
    }
    return null;
}

要测试静态 getDerivedStateFromProps,我们可以使用以下代码进行测试

let wrapper = shallow(      
        <Component {...props} />      
      );
const givenProps = {...};
const givenState = {...};
const result = wrapper.instance().constructor.getDerivedStateFromProps(givenProps , givenState );
expect(result).toEqual({
  ...
})

包装器 = 浅() wrapper.instance.getDerivedStateFromProps