React Native PayModal 组件的 Jest 单元测试
import React from 'react'; import { shallow } from 'enzyme'; import PayModal from '../PayModal';
describe('PayModal', () => {
let wrapper;
beforeEach(() => {
wrapper = shallow(
it('should render correctly', () => { expect(wrapper).toMatchSnapshot(); });
it('should set the initial state correctly', () => { expect(wrapper.state()).toEqual({ data: null, selPayWayIndex: 0, time: '', isLoading: true, isNetError: false, leftTime: 10000, confirmModalVisible: true, appState: AppState.currentState, paymentId: '', }); });
it('should handle '_handleAppStateChange' correctly', () => { const nextAppState = 'active'; wrapper.instance()._handleAppStateChange(nextAppState); expect(wrapper.state().appState).toEqual(nextAppState); expect(wrapper.instance().isChecking).toBe(false); });
it('should handle 'doWhileGetPayResult' correctly', () => { const paying = true; const visible = true; wrapper.setState({ paying, visible }); wrapper.instance().isChecking = false; wrapper.instance().isGoToSuccess = false; wrapper.instance()._checkPay = jest.fn(); wrapper.instance()._fetchData = jest.fn(); wrapper.instance().timerText = { stop: jest.fn() }; wrapper.instance().updateCallback = 'updateCallback'; wrapper.instance().props = { from: 'orderList', navigation: { navigate: jest.fn(), }, };
wrapper.instance().doWhileGetPayResult();
expect(wrapper.instance().isChecking).toBe(true);
expect(wrapper.instance()._checkPay).toHaveBeenCalledTimes(1);
expect(wrapper.instance()._fetchData).toHaveBeenCalledTimes(0);
wrapper.setState({ paymentId: 'paymentId' });
wrapper.instance().doWhileGetPayResult();
expect(wrapper.instance().isChecking).toBe(true);
expect(wrapper.instance()._checkPay).toHaveBeenCalledTimes(2);
expect(wrapper.instance()._fetchData).toHaveBeenCalledTimes(0);
wrapper.setState({ visible: false });
wrapper.instance().doWhileGetPayResult();
expect(wrapper.instance().isChecking).toBe(false);
expect(wrapper.instance()._checkPay).toHaveBeenCalledTimes(2);
expect(wrapper.instance()._fetchData).toHaveBeenCalledTimes(0);
wrapper.setState({ paying: false });
wrapper.instance().doWhileGetPayResult();
expect(wrapper.instance().isChecking).toBe(false);
expect(wrapper.instance()._checkPay).toHaveBeenCalledTimes(2);
expect(wrapper.instance()._fetchData).toHaveBeenCalledTimes(0);
wrapper.setState({ visible: true, paying: true });
wrapper.instance().doWhileGetPayResult();
expect(wrapper.instance().isChecking).toBe(true);
expect(wrapper.instance()._checkPay).toHaveBeenCalledTimes(3);
expect(wrapper.instance()._fetchData).toHaveBeenCalledTimes(0);
});
it('should handle '_checkPay' correctly', () => { const interval = 'interval'; const paymentId = 'paymentId'; const visible = true; const res = { code: 10000, data: { payStatus: '1', promotionType: 'prepare', preparePayType: 'deposit', }, }; const checkPay = jest.fn(() => Promise.resolve(res)); wrapper.setState({ paymentId, visible }); wrapper.instance()._checkPay(interval); expect(checkPay).toHaveBeenCalledTimes(1); expect(wrapper.instance().isChecking).toBe(false); expect(wrapper.instance().isGoToSuccess).toBe(true); expect(wrapper.instance().timerText.stop).toHaveBeenCalledTimes(1); expect(wrapper.instance().updateCallback).toBe(null); expect(wrapper.instance().props.navigation.navigate).toHaveBeenCalledTimes(1);
wrapper.instance()._handleBack = jest.fn();
wrapper.instance().props.from = 'confirm';
wrapper.instance().props.navigation = { replace: jest.fn() };
wrapper.instance()._handleOnClose();
expect(wrapper.instance().props.navigation.replace).toHaveBeenCalledTimes(1);
});
it('should handle '_handleOnClose' correctly', () => { wrapper.instance().props.onClose = jest.fn(); wrapper.instance().props.from = 'orderList'; wrapper.instance().updateCallback = 'updateCallback'; wrapper.instance().timerText = { stop: jest.fn() }; wrapper.instance()._handleOnClose(); expect(wrapper.instance().props.onClose).toHaveBeenCalledTimes(1); expect(wrapper.instance().updateCallback).toBe(null); expect(wrapper.instance().timerText.stop).toHaveBeenCalledTimes(1); expect(wrapper.state().visible).toBe(false); expect(wrapper.state().isLoading).toBe(false); expect(wrapper.state().paying).toBe(false); });
it('should handle 'show' correctly', () => { const data = { orderId: 'orderId', updateCallback: 'updateCallback' }; wrapper.instance()._fetchData = jest.fn(); wrapper.instance().show(data); expect(wrapper.state().visible).toBe(true); expect(wrapper.state().data).toEqual(data); expect(wrapper.state().isLoading).toBe(true); expect(wrapper.state().paying).toBe(true); expect(wrapper.state().paymentId).toBe(''); expect(wrapper.instance()._fetchData).toHaveBeenCalledTimes(1); expect(wrapper.instance().updateCallback).toBe(data.updateCallback); });
it('should handle '_fetchData' correctly', () => { const data = { orderId: 'orderId' }; const res = { code: 10000, data: { payStatus: 1 } }; const getList = jest.fn(() => Promise.resolve(res)); wrapper.setState({ data }); wrapper.instance()._handleNetResult = jest.fn(); wrapper.instance()._fetchData(); expect(getList).toHaveBeenCalledTimes(1); expect(wrapper.instance()._handleNetResult).toHaveBeenCalledTimes(1);
const res2 = { code: 20001 };
getList.mockReturnValueOnce(Promise.resolve(res2));
wrapper.instance()._handleNetResult = jest.fn();
wrapper.instance()._fetchData();
expect(getList).toHaveBeenCalledTimes(2);
expect(wrapper.instance()._handleNetResult).toHaveBeenCalledTimes(1);
const res3 = { code: 21000 };
getList.mockReturnValueOnce(Promise.resolve(res3));
wrapper.instance()._handleNetResult = jest.fn();
wrapper.instance()._fetchData();
expect(getList).toHaveBeenCalledTimes(3);
expect(wrapper.instance()._handleNetResult).toHaveBeenCalledTimes(1);
});
it('should handle '_handleNetResult' correctly', () => { const result = { data: { payStatus: 1, }, }; wrapper.instance().comfirmModal = { hide: jest.fn() }; wrapper.instance().isGoToSuccess = false; wrapper.instance().timerText = { stop: jest.fn() }; wrapper.instance().props.from = 'orderList'; wrapper.instance().updateCallback = 'updateCallback'; wrapper.instance().props.navigation = { navigate: jest.fn() }; wrapper.instance()._handleNetResult(result); expect(wrapper.instance().comfirmModal.hide).toHaveBeenCalledTimes(1); expect(wrapper.instance().isGoToSuccess).toBe(true); expect(wrapper.instance().timerText.stop).toHaveBeenCalledTimes(1); expect(wrapper.instance().updateCallback).toBe(null); expect(wrapper.instance().props.navigation.navigate).toHaveBeenCalledTimes(1);
wrapper.instance().isGoToSuccess = true;
wrapper.instance()._handleNetResult(result);
expect(wrapper.instance().comfirmModal.hide).toHaveBeenCalledTimes(1);
expect(wrapper.instance().isGoToSuccess).toBe(true);
expect(wrapper.instance().timerText.stop).toHaveBeenCalledTimes(1);
expect(wrapper.instance().updateCallback).toBe(null);
expect(wrapper.instance().props.navigation.navigate).toHaveBeenCalledTimes(1);
wrapper.instance().props.from = null;
wrapper.instance()._handleNetResult(result);
expect(wrapper.instance().comfirmModal.hide).toHaveBeenCalledTimes(1);
expect(wrapper.instance().isGoToSuccess).toBe(true);
expect(wrapper.instance().timerText.stop).toHaveBeenCalledTimes(1);
expect(wrapper.instance().updateCallback).toBe(null);
expect(wrapper.instance().props.navigation.replace).toHaveBeenCalledTimes(1);
const result2 = {
data: {
payStatus: 0,
leftTime: 100,
},
};
wrapper.instance().timerText = { start: jest.fn(), stop: jest.fn() };
wrapper.instance()._handleNetResult(result2);
expect(wrapper.instance().timerText.start).toHaveBeenCalledTimes(1);
expect(wrapper.instance().state.isLoading).toBe(false);
expect(wrapper.instance().state.isNetError).toBe(false);
expect(wrapper.instance().state.leftTime).toBe(100);
});
it('should handle '_handlePayResult' correctly', () => { const result = { code: 6001 }; const timer = setTimeout(() => {}, 500); wrapper.instance()._fetchData = jest.fn(); wrapper.instance()._handlePayResult(result); expect(clearTimeout).toHaveBeenCalledWith(timer); expect(wrapper.instance()._fetchData).toHaveBeenCalledTimes(1); });
it('should handle '_renderPayWayRow' correctly', () => { const data = { payable: '1' }; wrapper.setState({ data }); const title = '支付宝'; const appId = 'alipayapp'; const index = 0; const row = wrapper.instance()._renderPayWayRow({ title, appId, index }); expect(row).toMatchSnapshot();
const data2 = { payable: '0' };
wrapper.setState({ data: data2 });
const row2 = wrapper.instance()._renderPayWayRow({ title, appId, index });
expect(row2).toMatchSnapshot();
});
it('should handle '_doPayment' correctly', () => { const data = { orderId: 'orderId', payMoney: 100 }; wrapper.setState({ data }); const infoItem = { appId: 'alipayapp' }; const doPayment = jest.fn(() => Promise.resolve({ code: 10000, data: { html: 'html', paymentId: 'paymentId' } })); const aliPay = jest.fn(() => Promise.resolve({})); const Linking = { canOpenURL: jest.fn(() => Promise.resolve(true)) }; wrapper.instance().comfirmModal = { show: jest.fn() }; wrapper.instance()._handlePayResult = jest.fn(); wrapper.instance._doPayment(infoItem); expect(doPayment).toHaveBeenCalledTimes(1); expect(aliPay).toHaveBeenCalledTimes(1); expect(Linking.canOpenURL).toHaveBeenCalledTimes(1); expect(wrapper.instance().comfirmModal.show).toHaveBeenCalledTimes(1); expect(wrapper.instance()._handlePayResult).toHaveBeenCalledTimes(1); expect(wrapper.state().paymentId).toBe('paymentId');
const infoItem2 = { appId: 'wxpayapp' };
const wxPay = jest.fn(() => Promise.resolve({}));
wrapper.instance()._doPayment(infoItem2);
expect(wxPay).toHaveBeenCalledTimes(1);
});
it('should render correctly with different states', () => { wrapper.setState({ visible: false }); expect(wrapper).toMatchSnapshot();
wrapper.setState({ visible: true, isLoading: true });
expect(wrapper).toMatchSnapshot();
wrapper.setState({ visible: true, isLoading: false, leftTime: 1000 });
expect(wrapper).toMatchSnapshot();
wrapper.setState({ visible: true, isLoading: false, leftTime: 0 });
expect(wrapper).toMatchSnapshot();
}); });
原文地址: https://www.cveoy.top/t/topic/f3D2 著作权归作者所有。请勿转载和采集!