在 useEffect 挂钩中使用 axios 取消令牌时如何修复失败的测试

Posted

技术标签:

【中文标题】在 useEffect 挂钩中使用 axios 取消令牌时如何修复失败的测试【英文标题】:How to fix failing test when using axios cancel token in useEffect hook 【发布时间】:2021-02-02 10:10:06 【问题描述】:

我正在使用 axios 取消令牌在我的 useEffect 挂钩中进行清理,如下所示。当我运行测试时,我得到如下所示的错误。我正在使用反应测试库和开玩笑来测试我的应用程序。我也在使用模拟服务工作者来拦截和处理请求。有没有办法可以模拟 axios.CancelToken.source 调用来解决失败的测试?

UseEffect 钩子:

useEffect(() => 

 const source = axios.CancelToken.source()
 axios.get(URLS.GET_DATA,
  
    cancelToken: source.token
  )
  .then(response => 
    setData(response.data)
  )
  .catch((error) => 
    if (axios.isCancel(error)) 
     else 
      console.log('Handle Error')
    
  )

return () => 
  source.cancel()


, [building, numberOfDeletions, numberOfUpdates, numberOfAdds], [])

测试服务器服务工作者:

const server = setupServer(
rest.get('/api/data/'), (req, res, ctx) => 
return res(
  ctx.status(200),
  ctx.json( data: data )
))

测试失败:

it('should render title to page', () => 
const  getByText  = render(<EditIndex />)
const heading = getByText('Edit Items')

expect(heading.textContent).toEqual('Edit Items')
)

错误信息:

【问题讨论】:

这个错误可能意味着你已经在模拟 Axios 但你没有显示这个。否则它将有CancelToken 【参考方案1】:

this 帖子中的第二个解决方案对我有用。正如上面的评论所提到的,我已经在模拟 axios 并且我没有在模拟中定义 CancelToken 。我最终通过简单地传入 axios 来修改模拟,一切都通过了; CancelToken 不再是未定义的。

import axios from 'axios';
jest.mock('axios');

【讨论】:

以上是关于在 useEffect 挂钩中使用 axios 取消令牌时如何修复失败的测试的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 MaterialTable 中的 useEffect 挂钩显示数据

React - useEffect axios请求中设置的状态为空

如何检查 useEffect 中的数据加载

我可以在 getStaticProps 中使用 UseEffect 挂钩吗?

在自定义反应钩子中使用 axios

如何在 useEffect 挂钩中使用 Promise.all 获取所有数据?