У меня есть компонент React, который во время монтирования выполняет этот фрагмент кода
this.setState({ data: null, hasError:false, isLoading: true }
service.getData()
.then((response) => {
this.setState({data:response})
}
.catch(() => {
this.setState({ hasError: true})
}
.then(() => {
this.setState({ isLoading: false})
}
service.getData возвращает Promise. Я пытаюсь проверить этот компонент. Я написал несколько тестов, которые проверяют успешный запрос getData, например
const mockGetData = jest.fn().mockImplementation(()=>Promise.resolve("TESTSUCCESS"));
service.prototype.getData = mockGetData;
const wrapper = shallow(<MyComponent />);
await mockGetData;
expect(wrapper.state('data')).toBe("TESTSUCCESS");
, это прекрасно работает. И если, например, я поместил console.log в «then» в коде моего компонента, и добавлю console.log после await в моем тесте. Журнал «then» предшествует журналу «test».
Если я пытаюсь проверить сбой, хотя, например,
const mockGetData = jest.fn().mockImplementation(()=>Promise.reject("TESTFAILURE"));
service.prototype.getData = mockGetData;
const wrapper = shallow(<MyComponent />);
await mockGetData;
expect(wrapper.state('hasError')).toBe(true);
, этот тест не пройден. Если я добавлю console.log к перехвату в коде моего компонента - этот журнал появляется ПОСЛЕ моего журнала тестов, даже если мой журнал тестов появляется после «await».
Что мне нужно изменить, чтобы исправить это? Я думал, что ждать будет ждать, пока вся цепочка разрешится. Если нет, то почему работает тест успеха? Я пробовал wrapper.update () - это не помогает. Я уверен, что это что-то основное - пожалуйста, помогите.
спасибо