首页 > 解决方案 > 开玩笑:如何模拟动画循环?

问题描述

我正在尝试为具有以下动画代码(在 componentDidMount 上调用)的动画组件运行快照测试:

animate() {
  Animated.loop(
    Animated.sequence([
      Animated.timing(this.state.pulseAnimation, {
        toValue: 1,
        duration: 1000,
        easing: Easing.in(Easing.ease)
      })
    ]),
    {
      iterations: this.props.totalNumPulses
    }
  ).start();
}

我尝试使用以下内容模拟 Animated :

  jest.mock('Animated', () => {
    return {
      loop: jest.fn(() => {
        return {
          start: jest.fn(),
          reset: jest.fn()
        };
      }),
      timing: jest.fn(() => {
        return {
          start: jest.fn(),
        };
      }),
      Value: jest.fn(() => {
        return {
          interpolate: jest.fn(),
        };
      }),
    };
  });

但是,运行测试会导致此错误:

TypeError: animation.reset is not a function

  54 |         iterations: this.props.totalNumPulses
  55 |       }
> 56 |     ).start();
  57 |   }
  58 | 

我已经将重置模拟放在不同的地方,并检查了 React Native 中“循环”方法的源代码,但没有成功模拟它。有没有人成功地做到过这一点?

标签: react-nativejestjsreact-animated

解决方案


您的示例中的问题是您完全替换Animated为一个对象,而不是仅替换您需要测试的方法。

在下面的示例中,我模拟了它,parallel().start(callback)以便它立即调用回调。

// Tests/__mocks__/react-native.js

export const Animated = {
  ...RN.Animated,
  parallel: () => ({
    // immediately invoke callback
    start: (cb: () => void) => cb()
  })
};

这让我可以跳过动画并更好地测试我的start回调。Animated您可以对!的任何属性或子属性使用类似的方法。


推荐阅读