Тестирование вызовов Mocking API с использованием JEST - PullRequest
0 голосов
/ 12 июля 2020

У меня есть действие redux thunk, которое вызывает API, например:

export const submitNewUserPost = (title: string, body: string) => {
  return async (dispatch: Function) => {
    dispatch(isCreatingNewPost());
    try {
      const { payload } = await createPostAPI(title, body);
      dispatch(newUserProfilePost(payload.post));
    } catch (error) {
      dispatch(creatingNewPostFailed());
    }
  };
};

Я хотел протестировать createPostAPI, который реализован как:

export async function createPostAPI(title: string, body: string) {
  try {
    const res = await axios.post('/posts', {
      title,
      body
    });
    console.log(res);
    return res.data;
  } catch (error) {
    throw error.response.data;
  }
}

, тогда я издевался над этим API вызовите, например:

export default {
  getSomePostAPI: jest.fn(() =>
    Promise.resolve({
      data: {}
    })
  ),
  createPostAPI: jest.fn()
};

, чтобы затем использовать его в моем тестовом наборе, например:

describe('submitNewUserPost ACTION', () => {
    it('should call createPostAPI', async () => {
      const p = {
        id: 1,
        title: 'title',
        body: 'body',
        createdAt: '123',
        updatedAt: '123'
      };

      mockedAPI.createPostAPI.mockImplementationOnce(() => {
        return {
          data: {}
        };
      });


      await createPostAPI('waa', 'woo');
      expect(mockedAPI.createPostAPI).toHaveBeenCalledTimes(2);
      expect(mockedAPI.createPostAPI).toHaveBeenCalledWith('/posts');
      });
    });
  });

, но это не работает или выдает ошибку, потому что res не определено в createPostAPI. вот изображение.

введите описание изображения здесь

Подозреваю, что на mockImplementationOnce мне нужно вызывать фактический API? но я не хочу использовать API на каждом тесте. есть ли другой способ?

...