【问题标题】:Why is the prop not being updated on my child component in my test?为什么在我的测试中我的子组件上的道具没有更新?
【发布时间】:2019-04-29 12:58:18
【问题描述】:

以下是我的测试组件的相关部分。我试图通过打开Snackbar 然后单击SnackbarContentWrapper 组件中的关闭按钮来测试我的组件,该组件位于第三级嵌套中。

onSuccess() {
    this.setState({
        snackbarOpen: true,
        snackbarVariant: 'success',
        snackbarMsg: 'A super useful message'
    })
}

render() {
    return (
        <>
            ...some stuff...

            <MyForm
                beginAjaxCall={this.beginAjaxCall}
                endAjaxCall={this.endAjaxCall}
                onSuccess={this.onSuccess}
                onError={this.onError}
                onSave={save}
            />
            <Snackbar
                anchorOrigin={{
                    vertical: 'bottom',
                    horizontal: 'left'
                }}
                open={this.state.snackbarOpen}
                autoHideDuration={6000}
                onClose={this.onSnackbarClose}
            >
                <SnackbarContentWrapper
                    onClose={this.onSnackbarClose}
                    variant={this.state.snackbarVariant}
                    message={this.state.snackbarMsg}
                />
            </Snackbar>
        </>
    )
}

这是我的测试:

    it('state reflects closing the snackbar', () => {
        const page = mount(<MyPage/>),
            form = page.find(MyForm),
            snackbar = page.find(Snackbar),
            snackbarContent = snackbar.find(SnackbarContentWrapper)

        // test snackbar is closed at start (this passes)
        expect(page.state().snackBarOpen).toBeFalsy()

        // call the prop on form which calls the class method, onSuccess
        form.props().onSuccess()

        // (this passes)
        expect(page.state().snackbarOpen).toBeTruthy()

        page.update()
        snackbar.update()

        console.log(page.state().snackbarOpen) // true
        console.log(snackbar.props()) // false - should match state of page

        const button = snackbarContent.find('button')

        // crashes here
        button.simulate('click')

        expect(page.state().snackbarOpen).toBeFalsy()
    })

snackbar.props().open 设置为 false,即使 page.state().snackbarOpen 设置为 true。

另一个奇怪的是我得到了一个错误,方法“模拟”只意味着在单个节点上运行。而是找到了 0。 尝试模拟按钮单击时。但是,当我记录snackbar 的html 时,我可以看到从子snackbarContent 生成的html,包括按钮。

我已经为此工作了几个小时,并且我已经做了类似的事情来成功模拟按钮点击,所以我在这里不知所措。

【问题讨论】:

    标签: reactjs unit-testing jestjs material-ui enzyme


    【解决方案1】:

    我在 github 帖子中偶然发现一条无害的评论后发现了这一点。问题是必须找到依赖重新渲染的子组件 (.find()ed?) after .update(),而不是之前。从 v3 开始,它们是不可变的,因此如果像我所做的那样在测试的顶部设置变量,它们将不是最新的。所以,固定的测试是:

    it('state reflects closing the snackbar', () => {
        const page = mount(<MyPage/>),
            form = page.find(MyForm)
    
        // test snackbar is closed at start
        expect(page.state().snackBarOpen).toBeFalsy()
    
        // call the prop on form
        form.props().onSuccess()
    
        // on success, the snackbar should pop open
        expect(page.state().snackbarOpen).toBeTruthy()
    
        page.update()
    
        // **must grab components after** the update
        // to reflect their current state
        const snackbar = page.find(Snackbar),
            snackbarContent = snackbar.find(SnackbarContentWrapper),
            button = snackbarContent.find('button')
    
        // close the snackbar
        button.simulate('click')
    
        // state and prop are set back to closed
        expect(page.state().snackbarOpen).toBeFalsy()
    })
    

    在那之后,我的断言很适合当前的状态/道具。

    【讨论】:

      猜你喜欢
      • 2021-11-10
      • 1970-01-01
      • 2021-06-24
      • 2020-08-07
      • 1970-01-01
      • 2018-07-03
      • 2014-09-02
      • 2017-05-23
      • 2019-09-03
      相关资源
      最近更新 更多