使用Jest和Enzyme进行React-native测试未调用prop函数

时间:2019-10-11 09:01:08

标签: unit-testing react-native jestjs enzyme

我有以下测试用例

//to mock props
const createTestProps = (props) => ({
    ...props,
    processDecision: jest.fn(),
    navigation: {
        getParam: jest.fn(),
        navigate: jest.fn(),
    },
});

describe('TermsAndConditionsScreen', () => {
    let props, wrapper;
    beforeEach(() => {
        props = createTestProps({});
        wrapper = shallow(<TermsAndConditionsScreen {...props} />);
    });


    it('should invoke the processDecision twice', () => {

        wrapper = shallow(<TermsAndConditionsScreen {...props} />);
        wrapper.dive().find(Button).first().props().onPress();
        wrapper.dive().find(Button).last().props().onPress();
        expect(props.processDecision).toHaveBeenCalledTimes(2);

    });
});

由于某种原因,它没有检测到props.processDecision。但是如果我这样说的话,它就可以正常工作:

 it('should invoke the processDecision twice', () => {
            let mockFn = jest.fn();
            TermsAndConditionsScreen.prototype.processDecision = mockFn;        
            wrapper = shallow(<TermsAndConditionsScreen {...props} />);
            wrapper.dive().find(Button).first().props().onPress();
            wrapper.dive().find(Button).last().props().onPress();
            expect(mockFn).toHaveBeenCalledTimes(2);

        });

请问有什么区别? 预先谢谢你

1 个答案:

答案 0 :(得分:0)

以防万一有人面临同样的困难。在第一个示例中,将processDecision视为一个道具(不正确)。在第二个示例中,它正在考虑processDecision一个原型(的确如此),这就是它起作用的原因。