React - Тестирование компонента контроллера с помощью jest / энзима

Я зашел в тупик, так как не знаю, как мне проводить тестирование этого конкретного «компонента». В общем, у меня есть компонент контроллера, который является компонентом верхнего уровня. Он не принимает никаких реквизитов и визуализируется компонентом маршрута. Компонент контроллера имеет несколько функций, некоторые из которых передаются дочернему компоненту и запускаются обработчиками событий.

Кроме того, компонент контроллера использует API, который прикреплен к глобальному объекту окна. API принимает функцию обратного вызова, которая затем будет вызываться, когда вы вызываете определенные методы в API, после того, как методы были запущены. Прямо сейчас я понятия не имею, как мне попробовать протестировать контроллер. Я протестировал все дочерние компоненты и убедился, что все работает, но некоторые из этих функций в компоненте контроллера будут иметь решающее значение для проверки того, что они действительно работают.

const MyController = () => {
const [api, setApi] = useState(null)

useEffect(() => {
const globalApi = window.globalApi
setApi(globalApi)
init()
}, [])

function callBack(e) {
    console.log(e)
}

function init() {
        api.init(callBack)
}

function close() {
    api.close()
}

return (
    <MyComponent 
    close={close}
    />
)

}


person Kustemit    schedule 11.03.2020    source источник
comment
почему вы помещаете api в состояние, кажется ненужным.   -  person Joe Lloyd    schedule 11.03.2020


Ответы (1)


Издевайтесь над своим api и посмотрите, называется ли он

Вы можете следить за своим вызовом api из global (если я правильно прочитал ваш код). Затем вы можете смоделировать его реализацию.

const apiCall = jest.spyOn(global.globalApi, 'init').mockImplementation(jest.fn);
expect(apiCall).toHaveBeenCalled();

Вы можете провести пару тестов. Проверьте, сколько раз он вызывается, должен быть один раз для вас. и проверьте, с какими аргументами он был вызван.

Примечание

Использование global в шпионаже. global относится к окну.

Дополнительные тесты

Помимо этих тестов, я бы посоветовал сделать снимок неглубокого рендера, просто чтобы убедиться, что рендер всегда работает.

person Joe Lloyd    schedule 11.03.2020
comment
Я заставил это работать с вашим комментарием, большое вам спасибо. Единственное, с чем у меня все еще возникают проблемы, - это проверка того, был ли создан экземпляр класса. API возвращает объект, в котором есть как функции, так и классы, определенные для разных свойств. Он работает для функции init, но не будет работать при слежке, если был создан экземпляр класса. - person Kustemit; 11.03.2020
comment
имитируйте возвращаемое значение api, не тестируйте сторонние запросы в своих тестах. Вместо этого настройте макет «прошел и не прошел». - person Joe Lloyd; 11.03.2020