Функция Jest Mock не регистрирует вызов - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть компонент реагирования с методом, запрашивающим мой API.В целях тестирования я издевался над модулем axios . Jest распознает первый вызов с помощью get, но не второй с post, за исключением того, что указано перед оператором get.Я могу записать, что у axios.post.mock.result есть Promise for value в моем компоненте реагирования.В моем тесте он пуст.Я выделил проблему следующим образом:

Мой метод компонента

import axios from 'axios';

async getData(data) {
	let response = await axios.get('/api',
		{
			params: {
				data
			}
		});
	if (response.status === 200) {
		response = await axios.post('/api',
			response.data
		);
		if (response.status === 200) {
			this.setState({ data: true });
		}
	}
}

render() {
  if (!this.state.data) {
    return (
    <button 
    onClick={() => this.getData(this.state.input)}
    >Click me</button>)
  } else {
    return (<p>Success</p>);
}

Тест

import {render, fireEvent} from 'react-testing-library';
import axios from 'axios';
import App from '../App';

jest.mock('axios');

axios.get.mockResolvedValue({ status: 200, data: { hello: 'world' } });
axios.post.mockResolvedValue({ status: 200 });

test('Component uses axios', () => {
	let app = render(<App />);
	fireEvent.click(app.getByText('Click me'));
	expect(axios.get).toBeCalled();
	expect(axios.post).toBeCalled();
});

1 Ответ

0 голосов
/ 21 февраля 2019

реагирующая библиотека-тестирование в первую очередь предназначена для функционального тестирования черного ящика и не подходит для реализации тестирования.Распространенная стратегия тестирования - симуляция DOM с щелчком и утверждением:

const { getByText } = render(<App />);
fireEvent.click(app.getByText('Click me'));
await waitForElement(() => getByText('Success'));

Тест может быть дополнительно дополнен утверждениями реализации.axios.post вызывается асинхронно, и обещание, которое он возвращает, должно быть приковано:

...
fireEvent.click(app.getByText('Click me'));
expect(axios.get).toBeCalledTimes(1);
await axios.get.mock.results[0].value;
expect(axios.post).toBeCalledTimes(1);
await waitForElement(() => getByText('Success'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...