Проблема в том, что выборка происходит асинхронно.К тому времени, когда вы вызываете wrapper.debug()
, состояние уже не может быть обновлено, поскольку в стек событий был добавлен ответ fetch
.Таким образом, fetch
был назван , но он не дал никакого ответа.
Это можно увидеть, обновив тест до следующего вида:
// mock out fetch...
const wrapper = mount(<App />);
expect(fetch).toBeCalled();
setTimeout(() => {
wrapper.update();
console.log(wrapper.debug()); // should be showing the Data component now
}, 0);
Это позволяет вызывать обратные вызовы обещания перед попыткой увидеть обработанную разметку, поместив код обновления / отладки в конец стека событий.
Вы можете обернуть это setTimeout
в обещании вернуться из функции обратного вызова it
и поместить любую expects
в нее перед вами resolve
(в противном случае он может фактически никогда не запустить функции expect
до завершения теста).
// mock out fetch...
const wrapper = mount(<App />);
expect(fetch).toBeCalled();
return new Promise((resolve) => {
setTimeout(() => {
wrapper.update();
console.log(wrapper.debug()); // should be showing the Data component now
expect(...)
resolve();
}, 0);
});
Альтернативой может быть просто проверка того, что результат данных отображает то, что вы ожидаете, когда состояние имеет конкретные данные:
it("should render the app component once data is there", () => {
const wrapper = shallow(<App />);
wrapper.setState({
loading: false,
data: {
userName: "John",
surName: "Doe"
}
});
console.log(wrapper.debug()); // You'll see the DataComponent
});