首页 文章

如何使用Jest测试异步组件?

提问于
浏览
3

任何人都可以告诉我如何在安装一个调用 componendDidMount() 的组件时等待一个嘲笑的承诺解决?

class Something extends React.Component {
    state = {
      res: null,
    };

    componentDidMount() {
        API.get().then(res => this.setState({ res }));
    }

    render() {
      if (!!this.state.res) return
      return <span>user: ${this.state.res.user}</span>;
    }
}

API.get() 在我的开玩笑测试中被嘲笑

data = [
  'user': 1,
  'name': 'bob'
];

function mockPromiseResolution(response) {
  return new Promise((resolve, reject) => {
    process.nextTick(
      resolve(response)
    );
  });
}

const API = {
    get: () => mockPromiseResolution(data),
};

然后我的测试文件:

import { API } from 'api';
import { API as mockAPI } from '__mocks/api';

API.get = jest.fn().mockImplementation(mockAPI.get);

describe('Something Component', () => {
  it('renders after data loads', () => {
    const wrapper = mount(<Something />);
    expect(mountToJson(wrapper)).toMatchSnapshot();
    // here is where I dont know how to wait to do the expect until the mock promise does its nextTick and resolves
  });
});

问题是我 expect(mountToJson(wrapper)) 正在返回 null 因为 <Something /> 的模拟api调用和生命周期方法还没有通过 .

1 回答

  • 1

    Jest有假冒伪劣time travelling,在你的情况下使用它,我猜你可以用以下风格改变你的代码:

    import { API } from 'api';
    import { API as mockAPI } from '__mocks/api';
    
    API.get = jest.fn().mockImplementation(mockAPI.get);
    
    jest.useFakeTimers(); // this statement makes sure you use fake timers
    
    describe('Something Component', () => {
      it('renders after data loads', () => {
        const wrapper = mount(<Something />);
    
        // skip forward to a certain time
        jest.runTimersToTime(1);
    
        expect(mountToJson(wrapper)).toMatchSnapshot();
      });
    });
    

    作为 jest.runTimersToTime() 的替代,您也可以使用 jest.runAllTimers()

相关问题