Вы можете использовать подход async / await , чтобы проверить вашу функцию getData
как она есть async
, но сначала вам нужно смоделировать метод axios get
, потому что вы не хотите включатьвнешний вызов API в вашем тесте, вместо этого просто смоделируйте его ответ:
import React from 'react';
import axios from 'axios';
import {shallow, mount} from "enzyme";
import FormWrapper from './../containers/FormWrapper/FormWrapper'
jest.mock('axios'); // for mocking axios
it('test', async () => {
const wrapper = shallow(<FormWrapper />); // I'm using shallow render, you could use mount if you want to
const instance = wrapper.instance(); // get an instance in order to call getData() directly
// mock axios get with a response
axios.get.mockImplementation(() => Promise.resolve([
{
id: 1,
val: 'val1'
},
{
id: 2,
val: 'val2'
}
]));
await instance.getData();
expect(wrapper.state().targetingData).toHaveLength(2); // this is the length of the mocked response I have added here
});
Есть кое-что, что я хотел бы отметить здесь об этой функции.По моему мнению, функция getData()
, которую вы пытаетесь протестировать, на самом деле не является хорошим объектом для тестирования, поскольку она не содержит никакой написанной вами логики.
Она получает некоторые данные из API (который не являетсячем-то, что у вас есть), тогда он использует this.setState
для установки состояния (и вы не хотите проверять поведение React, выполняя setState
для обновления вашего состояния).
В случае, если вы хотите иметь state
заполняется некоторыми данными, чтобы использовать их для тестирования других функций в компоненте, тогда я предлагаю вам установить его вручную следующим образом:
const wrapper = shallow(<FormWrapper />);
wrapper.setState({
targetingData: {...}
});
, чтобы вы больше сосредоточились на функциях и частях кода, содержащих большелогику вы написали сами.