使用上下文消费者对 React 组件进行单元测试

Posted

技术标签:

【中文标题】使用上下文消费者对 React 组件进行单元测试【英文标题】:Unit-testing React Components using Context Consumers 【发布时间】:2019-02-24 20:18:47 【问题描述】:

我曾经有这样的组件:

class Foo extends React.Component 
    render() 
        return (
            <div className="Foo">
                <div id="user">Bar</div>
                <SomeOtherComponent />
            </div>
        )
    

还有这个测试:

it('renders a help button', () => 
  expect(shallow(<Foo />).find('#user').length).toEqual(1);
);

但是现在我已经为这个对象添加了一个上下文消费者:

class Foo extends React.Component 
    render() 
        return (
            <UserContext.Consumer>
                (user) => (
                    <div className="Foo">
                        <div id="user">user</div>
                        <SomeOtherComponent />
                    </div>
                )
            </UserContext.Consumer>
        )
    

如何测试以下条件?

“#user”的数量为1 显示的用户是提供的用户

【问题讨论】:

【参考方案1】:

您可以模拟UserContext.Consumer 以使用某个硬编码用户进行渲染。不确定如何导出 UserContext,但它看起来像这样:

jest.mock('path/to/UserContextModule', () => (
  UserContext: 
    Consumer: (children) => children(user: 'User')
  
))

您的其余测试将保持不变。

【讨论】:

另外,如果它很浅,你可能需要.dive() 不是我应得的英雄,而是我需要的英雄。

以上是关于使用上下文消费者对 React 组件进行单元测试的主要内容,如果未能解决你的问题,请参考以下文章

如何对 React-Redux 连接组件进行单元测试?

Typescript/React 单元测试库,能够单步调试导入的函数

如何对 fetch 完成后呈现的 React 组件进行单元测试?

使用Jest进行React单元测试(建议收藏)小白必看!

单元测试:用酶反应上下文 api 返回一个空对象

单元测试 React 功能组件的功能