Как издеваться над API-функциями внутри саги с помощью шуток? - PullRequest
1 голос
/ 10 ноября 2019

Я хочу смоделировать 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 с помощью фиктивной функции, потому что это свойство только для чтения согласно Typescript. Если я изменю способ экспорта функций API из index.ts в каталоге API на что-то вроде:

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

, я могу назначить фиктивную функцию для api.fetchTodosApi, но она сохранит свое первоначальное определение, а не определение изфиктивная функция, и она кажется хакерской. Как мне обойти это? Он работает с ванильным Javascript, как показано здесь: https://www.youtube.com/watch?v=a9f97afxa9A

1 Ответ

0 голосов
/ 10 ноября 2019

Вы должны использовать jest.mock и смоделировать модуль, как в документации здесь . Для макета магазина вы можете посмотреть на этот пакет

...