У меня есть следующая (упрощенная) часть React.
class SalesView extends Component<{}, State> {
state: State = {
salesData: null
};
componentDidMount() {
this.fetchSalesData();
}
render() {
if (this.state.salesData) {
return <SalesChart salesData={this.state.salesData} />;
} else {
return <p>Loading</p>;
}
}
async fetchSalesData() {
let data = await new SalesService().fetchSalesData();
this.setState({ salesData: data });
}
}
При установке я извлекаю данные из API, которые я отвлек в классе под названием SalesService
. Этот класс я хочу высмеять, а для метода fetchSalesData
я хочу указать возвращаемые данные (в обещании).
Это более или менее то, как я хочу, чтобы мой тестовый пример выглядел следующим образом:
- предопределить тестовые данные
- импортировать SalesView
- mock SalesService
-
настроить mockSalesService, чтобы вернуть обещание, которое возвращает предопределенные тестовые данные при разрешении
-
создать компонент
- Await
- проверить моментальный снимок
Тестирование взглядов SalesChart не является частью этого вопроса, я надеюсь решить это с помощью Enzyme. Я пробовал десятки вещей, чтобы издеваться над этим асинхронным вызовом, но, похоже, я не могу правильно это высмеять. Я нашел следующие примеры Jest, издевающихся в Интернете, но они, похоже, не охватывают это основное использование.
- Hackernoon: не использует асинхронные вызовы
- Технический блог Wehkamp: не использует асинхронные вызовы
- Агата Кшивда: не использует асинхронные вызовы
- GitConnected: не использует класс с функцией для макета
- Учебник Jest Пример Async: не использует класс с функцией для издевки
- Jest tutorial Тестирование асинхронного кода: не использует класс с функцией для издевки
- SO question 43749845: Я не могу подключить макет к реальной реализации таким образом.
- 42638889: Я использую инъекцию зависимостей, я не
- 46718663: не показано, как реализован фактический mock-класс.
Мои вопросы:
- Как должен выглядеть класс макета?
- Где я должен разместить этот класс-макет?
- Как мне импортировать этот класс mock?
- Как я могу сказать, что этот mock-класс заменяет реальный класс?
- Как настроить макетную реализацию определенной функции класса mock?
- Как подождать в тестовом примере для обещания, которое нужно решить?
Один пример, который у меня есть, не работает, приведен ниже. Тест-бегун выходит из строя с ошибкой throw err;
, а последняя строка в трассировке стека at process._tickCallback (internal/process/next_tick.js:188:7)
# __tests__/SalesView-test.js
import React from 'react';
import SalesView from '../SalesView';
jest.mock('../SalesService');
const salesServiceMock = require('../SalesService').default;
const weekTestData = [];
test('SalesView shows chart after SalesService returns data', async () => {
salesServiceMock.fetchSalesData.mockImplementation(() => {
console.log('Mock is called');
return new Promise((resolve) => {
process.nextTick(() => resolve(weekTestData));
});
});
const wrapper = await shallow(<SalesView/>);
expect(wrapper).toMatchSnapshot();
});