Вы близки.
Вы в настоящее время насмехаетесь над WebBrowser
, чтобы стать свойством внутри из Constants
, поэтому его необходимо удалить следующим образом:
jest.mock('expo', () => ({
Constants: {
manifest: {
version: '0.0.1',
releaseChannel: 'PROD',
}
},
WebBrowser: {
openBrowserAsync: jest.fn()
}
}));
Другая проблема заключается в том, как simulate
работает при использовании shallow
.Из раздела Common Gotchas в документе:
Даже если имя подразумевает, что это имитирует фактическое событие, .simulate()
фактически нацеливается на опору компонента на основе событияВы даете это.Например, .simulate('click')
фактически получит реквизит onClick
и вызовет его.
... и поскольку ваш компонент не имеет свойства onClick
, вызов .simulate('click')
завершается выполнениемНичего.
В этом посте от разработчика Airbnb рекомендуется напрямую вызывать реквизиты и избегать simulate
.
Вы можете вызвать onPress
, вызвав реквизит прямо так:
wrapper.find({ testId: 't-and-c' }).props().onPress();
Итак, все вместе рабочий тест выглядит так:
import React from 'react';
import { shallow } from 'enzyme';
import config from '../../config';
import AboutScreen from '../AboutScreen';
import { Constants, WebBrowser } from 'expo';
const { termsAndConditionsUrl, privacyPolicyUrl } = config;
jest.mock('expo', () => ({
Constants: {
manifest: {
version: '0.0.1',
releaseChannel: 'PROD',
}
},
WebBrowser: {
openBrowserAsync: jest.fn()
}
}));
it('click on terms and conditions link', () => {
const mock = jest.spyOn(WebBrowser, 'openBrowserAsync');
mock.mockImplementation(() => Promise.resolve());
const wrapper = shallow(<AboutScreen />);
wrapper.find({ testId: 't-and-c' }).props().onPress();
expect(mock).toHaveBeenCalledWith('tcUrl'); // Success!
});