Porque é que a prop não sendo atualizado no meu componente filho no meu teste?

votos
0

Abaixo estão as partes relevantes do meu componente para o teste. Eu estou tentando testar meu componente abrindo o Snackbare clicando no botão fechar no SnackbarContentWrappercomponente, que está no 3º nível de aninhamento.

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>
        </>
    )
}

Este é o meu teste:

    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é definido como falso, mesmo que page.state().snackbarOpené definido como verdadeiro.

Outra esquisitice é que eu estou recebendo um erro, Method “simular” serve apenas para ser executado em um único nó. 0 encontrados em seu lugar. ao tentar simular o clique de botão. No entanto, quando eu registrar o html de snackbar, eu posso ver o HTML gerado a partir da criança snackbarContent, incluindo o botão.

Venho trabalhando nisso há várias horas e eu tenho feito coisas semelhantes a ele para simular cliques de botão com sucesso, então eu estou em uma perda aqui.

Publicado 27/11/2018 em 17:59
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

Eu descobri isso depois de tropeçar através de um comentário inócuo em um post github. A questão é que os componentes filhos contando com a re-render têm de ser encontrado ( .find()ed?) Depois .update() , não antes. Eles são imutáveis a partir de v3, por isso, as variáveis não será atual se situado no topo do teste como eu fiz. Assim, o teste fixo é:

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()
})

Depois disso, minhas afirmações eram bons para ir com os atuais estaduais / adereços.

Respondeu 28/11/2018 em 13:44
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more