如何使用react-test-renderer和jest测试包含嵌套组件的已连接组件的react组件?

时间:2019-01-09 09:38:19

标签: react-native jestjs react-test-renderer

实际上,我正在使用react-test-render和jest在react-native中编写测试用例吗?我有一个需要测试的组件,并且该组件包含作为连接组件的嵌套组件。 下面是我编写的用于测试组件的代码:

import React from 'react';
import renderer from 'react-test-renderer';
import sinon from 'sinon';
import { clone } from 'lodash';
import { ProfileImageSelect } from 
'../../../../components/settings/ProfileImageSelect';

const userInfo = {
    first_name: 'test_first_name',
    last_name: 'test_last_name'
};

describe('<ProfileImageSelect />', () => {
    let onClose;
    let onSelect;
    let socialLogins;

    beforeEach(() => {
        socialLogins = {
            facebook: {
                id: '187416164',
                identifier: 'adams_facebook',
                full_name: 'Eric Adams',
                profile_pic: 'profile_pic_facebook.jpeg',
                expired: false
            },
            twitter: {
                full_name: 'Eric Adams',
                id: '187416164',
                identifier: 'adams_ea',
                profile_pic: 'https://pbs.twimg.com/profile_images/707586445427380226/5uETA8fs.jpg',
                expired: false
            },
            linkedin: {
                full_name: 'Eric Adams',
                id: '8vN6Da_RJJ',
                identifier: 'adams.ea@gmail.com',
                profile_pic:
                    'https://media.licdn.com/dms/image/C5603AQFfn5Ko5IS1NQ/profile-displayphoto-shrink_100_100/0?e=1549497600&v=beta&t=11m5mirEr_R2gf3OOfh3zHTL3Xe2ImrxcZ7l7ebLDa0',
                expired: false
            }
        };
        onClose = sinon.stub();
        onSelect = sinon.stub();
    });

    it('calls onClose on the props on click of cancel link ', () => {
        const connected = clone(socialLogins, true);
        const testRenderer = renderer.create(
            <ProfileImageSelect
                onSelect={onSelect}
                onClose={onClose}
                socialLogins={connected}
                userInfo={userInfo}
            />
        );
        const root = testRenderer.root;
        root.findByProps({ className: 'cancel' }).props.onPress();
        expect(onClose.called).toEqual(true);
    });
});

但这显示了一个错误:

永久违反:在“ Connect(SocialServiceProfileImage)”的上下文或道具中找不到“存储”。将根组件包装在中,或者将“存储”作为道具明确传递给“ Connect(SocialServiceProfileImage)”。

我知道我可以使用'react-test-renderer / shallow'进行浅层渲染,但它不允许我像Enzyme一样从DOM中找到任何节点。 谁能帮我这个?。我没有酶,也不想用来反应-redux-mock-store。

2 个答案:

答案 0 :(得分:0)

您可以手动定义模拟存储,并将其作为道具传递给组件。不幸的是,它仅适用于指定的组件,如果想更深入,则必须使用redux-mock-store或编写自己的上下文提供程序。

答案 1 :(得分:0)

您可以为

添加其他默认导出

ProfileImageSelect(未连接)(类), 并将其默认导入:

import  ProfileImageSelect  from 
'../../../../components/settings/ProfileImageSelect';

以这种方式运行浅层单元测试。 其他解决方案将要求您提供某种类型的存储/模拟存储,因为它们是集成测试。 通常,仅出于测试目的,添加代码或公开对象不是最佳实践。