无法模拟API请求



在我的TypeScript项目中设置jest测试mock非常困难。我想知道是否有人能给我指一个正确的方向?

我有一个看起来像这样的函数:

检索数据

import fetch from 'cross-fetch'; 
export async function retrieveData({
  endpoint,
  configuration,
  auth
}: dataInterface): Promise<object> {
  try {
    console.log('Fetching the requested data... 📦')
    const settings = configuration
      ? JSON.parse(render(configuration || '', auth))
      : {}
    if (settings.body) {
      // Ensures the body is stringified in the case of a post request being made.
      settings.body = JSON.stringify(settings.body)
    }
    const response = await fetch(endpoint, settings)
    return await response.json()
  } catch (error) {
    throw new Error(`There was an error fetching from the API: ${error}`)
  }
}

我正在fetch.test.ts中这样测试它

// Enable the mocks
import { enableFetchMocks } from 'jest-fetch-mock'
enableFetchMocks()
import fetchMock from 'jest-fetch-mock';
import {retrieveData, generateExport} from '../src/fetch'
describe('fetch', () => {
  describe('retrieveData', () => {
    it('should return some data', async () => {
      fetchMock.mockResponseOnce(JSON.stringify({ data: '12345' }))
      const data = await retrieveData({
        endpoint: 'https://example.com'
      })
      expect(data).toEqual({ data: '12345' })
    })
  })
})

我遇到的问题是,这个库似乎无法接管对fetch的调用。在我的函数中放入一个完全限定的URL将导致返回实际数据。我希望它检索data: '12345'对象。我哪里错了?

更新:

以下模式在导入import 'cross-fetch/polyfill';时有效,但如果我使用import fetch from 'cross-fetch';,则无效。使用第一个import语句的问题是,它使我的linter说fetch没有定义时出错。如果我在获取导入之前控制台日志,它会显示正确的mock构造函数。我试着处理模拟的进口订单,但它仍然有同样的问题:

import fetchMock, {enableFetchMocks} from 'jest-fetch-mock'
import {retrieveData, generateExport} from '../src/fetch'
enableFetchMocks()

这显然是某种进口订单问题,但我不确定用Jest解决这个问题的正确方法。将fetch添加到esint中的全局对象是否是一个合适的解决方案?

你能试试这个代码吗。

describe('retrieveData', () => {
  it('should return some data', () => {
    fetchMock.mockResponseOnce(JSON.stringify({ data: '12345' }))
    retrieveData({
      endpoint: 'https://example.com'
    }).then(res => {
       expect(res).toEqual({ data: '12345' })
    })
  })
})

相关内容

  • 没有找到相关文章

最新更新