Что делать, если вы хотите проверить, была ли вызвана функция, в componentDidMount() Методе жизненного цикла React. В основном код компонента выглядит так:
state = {
randomStateToPopulate: []
};
// Test componentDidMount
componentDidMount() {
this.randomFunction();
}
randomFunction= () => {
listRandomData().then(({ data }) => {
this.setState({ randomStateToPopulate: data });
});
};
Итак, как на самом деле проверить этот случай?





Это сценарий, который вы хотите протестировать. Если компонент componentDidMount вызывается, убедитесь, что он был вызван только один раз или столько раз, сколько вы хотите.
Ваш тест. I have the explanation in comments below
// Inside your general `Describe`
let wrapper;
const props = {
// Your props goes here..
};
beforeEach(() => {
wrapper = shallow(<YourComponent {...props} />);
});
it('should check `componentDidMount()`', () => {
const instance = wrapper.instance(); // you assign your instance of the wrapper
jest.spyOn(instance, 'randomFunction'); // You spy on the randomFunction
instance.componentDidMount();
expect(instance.randomFunction).toHaveBeenCalledTimes(1); // You check if the condition you want to match is correct.
});
Вы можете абстрагироваться, в данном случае, чтобы делать более сложные вещи, но основная суть этого выше. Если у вас есть более подробное или лучшее решение, пожалуйста, опубликуйте его. Спасибо!!
это верно. вы должны сами вызвать componentDidMount() в тестовом примере.
в моем случае instance это null, независимо от того, использую ли я mount или shallow :(
@GregWoz Я получил тот же результат, что и ты. Для меня это выглядело так, как будто у меня был ReactFragment в качестве родительского тега html, который возвращал мой компонент. что-то вроде: «return (<><MyComponent/></>)», и это все испортило. Я исправил это, используя Find для экземпляра (instance.Find('MyComponent'))
Как написано, единственный способ протестировать этот компонент — «белый ящик», что означает, что вы должны написать утверждение, основанное на состоянии
randomFunction(например, был ли он вызван) илиrandomStateToPopulate(независимо от того, был ли он назначенdata). Но у тестирования белого ящика есть недостаток: если вы измените внутреннюю реализацию, тест может сломаться. Если вы покажете, насколько вы с использованиемrandomStateToPopulate(например, поместите это в список HTML), вы можете написать тест, который не привязан к деталям реализации.