【发布时间】:2020-08-24 15:57:27
【问题描述】:
在使用 Jest 编写测试时,异步模拟 Axios 请求导致在安装组件后调用 setState()。这导致在测试运行期间出现控制台输出。
it('renders without crashing', () => {
const mockAxios = new MockAdapter(axios);
mockAxios.onGet(logsURL).reply(200, [...axios_logs_simple]);
const div = document.createElement('div');
ReactDOM.render(<Logs />, div);
ReactDOM.unmountComponentAtNode(div);
});
在<Logs> 组件中:
componentDidMount() {
axios.get(apiURL).then(response => {
this.setState({data: response.data});
});
}
我发现 blog post 显示了一个解决方案,但我不明白它是如何发挥作用的:
it('renders without crashing', async () => { //<-- async added here
const mockAxios = new MockAdapter(axios);
mockAxios.onGet(logsURL).reply(200, [...axios_logs_simple]);
const div = document.createElement('div');
ReactDOM.render(<Logs />, div);
await flushPromises(); //<-- and this line here.
ReactDOM.unmountComponentAtNode(div);
});
const flushPromises = () => new Promise(resolve => setImmediate(resolve));
据我了解,它创建了一个立即解决的新承诺。那如何保证其他异步代码也能解决?
现在,它解决了这个问题。测试运行期间没有更多控制台消息。测试仍然通过(这不是一个很好的测试)。但这看起来就像我只是落在了竞争条件的另一边,而不是一开始就阻止了竞争条件。
【问题讨论】:
标签: reactjs mocking jestjs axios es6-promise