Шут ждут асинхронного отклонения - PullRequest
0 голосов
/ 03 октября 2019

У меня есть компонент 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 () - это не помогает. Я уверен, что это что-то основное - пожалуйста, помогите.

спасибо

...