如何使用Jest和Enzyme测试样式化的组件是否具有属性

时间:2019-05-07 08:18:50

标签: javascript reactjs jestjs enzyme styled-components

我有一个带样式的组件,它包装了带有某些样式的输入复选框元素。在我的应用中,默认情况下可能已选中此复选框。这是一些组件代码:

const InputCheckbox = styled.input.attrs((props) => ({
    id: props.id,
    type: 'checkbox',
    checked: props.checked
}))`
    visibility: hidden;

    &:checked + label {
        background-color: ${(props) => props.theme.mainColor};
        border-color: ${(props) => props.theme.mainColor};

        &:after {
            border-left: 2px solid #fff;
            border-bottom: 2px solid #fff;
        }
    }
`;


function Checkbox(props) {
    return (
        <CheckboxContainer>
            <InputCheckbox
                id={props.id}
                checked={props.checked}
                onChange={(event) => {
                    props.onChange(event.target.checked);
                }}
            />
            <CheckboxLabel id={props.id} />
        </CheckboxContainer>
    );
}

我正在使用Jest和Enzyme进行测试,但找不到任何有关如何深入到您的Enzyme浅层包装中以检查InputCheckbox内的输入的checked属性为true的信息。例如:

describe('Checkbox', () => {
    const mockProps = {
        id: 'settings-user',
        checked: true,
        onComplete: (id) => jest.fn(id)
    };

    const component = shallow(<Checkbox {...mockProps}/>);

    describe('on initialization', () => {
        it('Input should be checked', () => {
            const inputCheckbox = component.find('InputCheckbox');
            expect(inputCheckbox.props().checked).toBe(true);
        });
    });
});

此测试失败,因为.find()找不到任何节点。

1 个答案:

答案 0 :(得分:1)

  1. 您需要设置显示名称以供其使用:

    InputCheckbox.displayName = 'InputCheckbox';

    之后尝试 component.find('InputCheckbox')

    为方便起见,请使用babel plugin


  2. 也尝试将find与组件构造函数一起使用。

    import InputCheckbox from 'path-to-component';
    
    ...
    
    const inputCheckbox = component.find(InputCheckbox);
    
    


  3. 在您需要访问子组件的情况下,可能需要使用“ mount” 插入了“浅”。