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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用react-test-renderer和jest测试包含嵌套组件的反应组件?相关的知识,希望对你有一定的参考价值。

实际上,我正在使用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)”的上下文或道具中找到“store”。将根组件包装在a中,或者将“store”显式传递为“Connect(SocialServiceProfileImage)”的prop。

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

答案

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

另一答案

您可以为其添加其他默认导出

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

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

这样你就可以进行浅单元测试了。其他解决方案将要求您提供某种存储/模拟存储,因为它们是集成测试。通常,为了测试而添加代码或公开对象通常不是最佳做法。

以上是关于如何使用react-test-renderer和jest测试包含嵌套组件的反应组件?的主要内容,如果未能解决你的问题,请参考以下文章

travis 无法构建,因为错误:找不到模块“react-test-renderer/shallow”

为啥 react-test-renderer 在 React 中只能在同一个文件中 findByType 功能组件?

使用 Hooks 在 React 中对 Apollo Graphql 进行单元测试

IDE 无法识别 Jest 及其功能

用 Jest 测试 React 应用程序:意外的令牌

如何使用J-Link远程调试?