Да, вы на правильном пути ... проблема в том, что closeModal
является асинхронным.
await
не завершено к тому времени, когда выполнение возвращается к тесту, поэтому this.props.navigation.navigate
еще не был вызван.
Тест должен дождаться завершения closeModal
, прежде чем будет подтверждено, что был вызван navigate
.
closeModal
- это функция async
поэтому он вернет Promise
...
... и вы можете использовать шпиона, чтобы получить Promise
, который он возвращает ...
... тогда вы можете позвонитьawait
на этом Promise
в вашем тесте, чтобы убедиться, что closeModal
завершено, прежде чем утверждать, что был вызван navigate
.
Вот упрощенный рабочий пример для начала:
import * as React from 'react';
import { shallow } from 'enzyme';
class MyClass extends React.Component {
closeModal = async () => {
await Promise.resolve();
this.props.navigation.navigate('Main');
}
render() { return <div onClick={() => this.closeModal()}></div> }
}
test('MyClass', async () => { // <= async test function
const props = { navigation: { navigate: jest.fn() }};
const wrapper = shallow(<MyClass {...props} />);
const instance = wrapper.instance();
const spyCloseModal = jest.spyOn(instance, 'closeModal');
wrapper.find('div').simulate('click');
expect(spyCloseModal).toHaveBeenCalled(); // Success!
const promise = spyCloseModal.mock.results[0].value; // <= get the Promise returned by closeModal
await promise; // <= await the Promise
expect(props.navigation.navigate).toHaveBeenCalled(); // Success!
})
Обратите внимание на использование mockFn.mock.results
для получения Promise
, возвращаемого closeModal
.