У меня есть действие 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 на каждом тесте. есть ли другой способ?