Здесь есть две проблемы
Асинхронный вызов setData
setData
вызывается в Promise
обратном вызове.
Как только Promise
разрешается, все обратные вызовы, ожидающие его, ставятся в очередь в очереди PromiseJobs . Все ожидающие задания в очереди PromiseJobs запускаются после завершения текущего сообщения и до начала следующего сообщения .
В этом случае текущее запущенное сообщение - это ваш тест, поэтому ваш тест завершается до того, как будет выполнен обратный вызов Promise
, и setData
не будет вызван до после вашего теста.
Вы можете исправить это, используя что-то вроде setImmediate
, чтобы отложить ваши утверждения до тех пор, пока не будут запущены обратные вызовы в PromiseJobs.
Похоже, вам также нужно будет вызвать component.update()
, чтобы повторно отрендерить компонент с новым состоянием. (Я предполагаю, что это потому, что изменение состояния происходит вне act
, поскольку нет никакого способа обернуть этот код обратного вызова в act
.)
Все вместе, рабочий тест выглядит так:
it('should render a proper table data', done => {
const mock = new MockAdapter(axios);
mock.onGet('/path/to/api').reply(200, response.data);
const component = mount(<SalesPlanTable />);
setImmediate(() => {
component.update();
console.log(component.debug());
done();
});
});
Предупреждение. Обновление до ... не было включено в действие (...)
Предупреждение вызывается обновлениями состояния компонента, которые происходят за пределами act
.
Изменения состояния, вызванные асинхронными вызовами setData
, вызванными useEffect
функцией , всегда будут происходить за пределами act
.
Вот чрезвычайно простой тест, демонстрирующий это поведение:
import React, { useState, useEffect } from 'react';
import { mount } from 'enzyme';
const SimpleComponent = () => {
const [data, setData] = useState('initial');
useEffect(() => {
setImmediate(() => setData('updated'));
}, []);
return (<div>{data}</div>);
};
test('SimpleComponent', done => {
const wrapper = mount(<SimpleComponent/>);
setImmediate(done);
});
Когда я искал дополнительную информацию, я наткнулся на enzyme
выпуск # 2073 , открывшийся 10 часов назад и рассказавший об этом же поведении.
Я добавил вышеуказанный тест в комментарии , чтобы помочь разработчикам enzyme
решить эту проблему.