如何用笑话在传奇中模拟API函数?

时间:2019-11-10 14:27:14

标签: reactjs typescript testing redux-saga

我想在我的saga测试中模拟API函数,但是我不能,因为打字稿抱怨它是一个只读属性。这是我的代码。

// src/api/todos.ts
import axios from './utils/axios'
import { handleError } from './error'

export const fetchTodosApi = async () => {
   return axios.get(`/todos/`).catch(handleError)
}

我有index.ts可以像这样导出所有API函数:

export { fetchTodosApi } from './todos'

然后是我的测试传奇:

// src/tests/fetchTodos
import { runSaga } from 'redux-saga'
import { fetchTodos } from 'sagas'
import * as api from 'api'

describe('testing fetchTodosApi ', () => {
   it('is able to fetch todos', async () => {
      const dispatchedActions: Array<any> = []
      api.fetchTodosApi = jest.fn(() => Promise.resolve({}))

      const fakeStore: any = {
         dispatch: (action: any) => dispatchedActions.push(action),
         getState: () => state,
      }

      await runSaga(fakeStore, fetchTodos, action).toPromise()

      expect(dispatchedActions[0].todos).toEqual({})
   })
})

问题是我无法为api.fetchTodosApi分配模拟函数cos,这是根据Typescript的只读属性。如果我更改了api函数从api目录中的index.ts导出为类似的方式:

import { fetchTodosApi } from './todos'
const api = { fetchTodosApi }
export default api

我可以为api.fetchTodosApi分配一个模拟函数,但是它保留了其原始定义,而不是模拟函数的定义,因此感觉很黑。我该如何解决?它可以与香草Javascript一起使用,如下所示:https://www.youtube.com/watch?v=a9f97afxa9A

1 个答案:

答案 0 :(得分:0)

您应该使用jest.mock并像文档here中那样模拟模块。对于模拟商店,您可以查看this包裹