如何避免在玩笑/酶单元测试中使用setTimeout来给出响应本机时间来呈现异步功能

sfr*_*ini 6 reactjs jestjs react-native enzyme

基本上,我有一个React Native组件,这是我的Login组件。我想测试多个状态变化。

我的组件的第一阶段是显示一个加载组件,然后通过多个异步函数,例如:

  • NetInfo:为了查看是否可以使用网络登录自动登录
  • setState:一些状态更改,还具有回调函数。
  • 提取:从API取回信息。

到目前为止,我已经模拟了fetch和NetInfo。覆盖率表明,某些函数的执行方式类似于setState中的回调,但是例如snapchots显示了第一个原始状态,即加载微调器。

我知道这是预料之中的,因此我尝试在浅层包装实例上执行forceUpdate和updae,并且快照中没有任何变化。对我唯一有效的方法是将超时设置为100ms,然后检查包装器。另外,我需要手动执行一些内部功能,因为某种程度上,并非所有功能都可以执行,就像setState中的回调一样。这很奇怪,因为覆盖率表明setState是执行的,而不是回调。

笑话单元测试:

it("should store the confirmation result", (done) => {

        let wrapper = shallow( <LoginComponent
            sms={{
                enabled: true,
                sms_placeholder: 'Phone Number',
                text: 'Enter your phone number',
                buttonSend: {
                    text: 'SEND'
                }
            }}
        />); 
        wrapper.setState({phone: '1234567890'});

        setTimeout(()=>{
            expect(wrapper.update()).toMatchSnapshot();    
            const spySendSms = jest.spyOn(wrapper.instance(), "sendSms");
            const spyError = jest.spyOn(wrapper.instance(), "error");
            wrapper.update().find("[testID='smsButtonSend']").simulate("press");
            expect(spySendSms).toHaveBeenCalledTimes(1);
            expect(spyError).toHaveBeenCalledTimes(0);                      
            done();         
        }, 100);  });
Run Code Online (Sandbox Code Playgroud)

我一直在阅读有关将承诺返还给Jest的信息,因此它们都被链接在一起,但是我只看到它是通过fetch生成的,并将功能作为道具传递给组件的,而我直接在组件内部拥有所有这些功能。

我应该重构需要外部功能的组件吗?在每个单元测试中都覆盖并模拟内部函数?

很难测试这种复杂的场景。