Maneira correta de escrever testes para React

Alex Ironside

Então, eu simplesmente tropecei nesse assunto. Gostaria de perguntar sobre a melhor forma de resolver esse problema. Esta é uma parte relevante do meu App.jscódigo:

addTask = (text) => {
    const {tasks} = this.state;
    tasks.push({text});
    this.setState({tasks});
};

<AddTaskConfirmBtn
    text={
        this.state.newTaskValue // This is just a simple state string
    }
    addTask={
        this.addTask
    }/>

AddTask teste

it('should addTask', function () {
    wrapper
        .instance()
        .addTask('testing');
    expect(
        wrapper
            .state('tasks')
    ).toEqual([
        {text: 'make todo with hooks'},
        {text: 'write tests'},
        {text: 'do the daily'},
        {text: 'testing'},
    ])
});

AddTaskConfirmBtn código:

render() {
    return (
        <button
            onClick={
                    this.props
                        .addTask // This is the issue. This adds an object to the array. It is solved below
            }>
            Add task
        </button>
    );
}

// Somente para referência. Foi assim que resolvi o problema

render() {
    return (
        <button
            onClick={
                () => {
                    this.props
                        .addTask(this.props.text)
                }
            }>
            Add task
        </button>
    );
}

E aqui está meu teste:

describe('<AddTaskConfirmBtn/>',
    function () {
        let wrapper;
        let addTaskMock = jest.fn();
        beforeEach(
            function () {
                wrapper = shallow(
                    <AddTaskConfirmBtn addTask={addTaskMock}/>
                );
            }
        );
        it('should addTaskToTasks onClick',
            function () {
                wrapper
                    .find('button')
                    .simulate('click');
                expect(addTaskMock).toHaveBeenCalledTimes(1);
            }
        );
    }
)

Em primeiro lugar, estou aprendendo os testes de unidade e TDD, então, por favor, seja gentil com minha estupidez.

Agora, para o meu problema. Eu estava testando meu código da maneira vista acima. Assim, adicionando o valor correto e colocando-o no estado, e comparando. O AddTaskConfirmBtn estava apenas verificando se o método foi chamado.

Mas acabei de perceber que há um erro que não considerei em meus testes. Eu estava colocando a coisa errada no array (acredito que era o objeto de evento que eu estava colocando no estado). Consertei, mas o interessante é que os testes não pegaram. Obviamente porque não os escrevi dessa forma.

Portanto, minha pergunta é: devo me preocupar com isso? Devo levar em conta situações como essa em meus testes? Ou é apenas algo que acontece? Ou talvez eu deva colocar salvaguardas no próprio método? Gostar

addTask = (text) => {
    if (typeof text !== "string") {
        console.log("text is not a string", text);
        return null;
    }
    const {tasks} = this.state;
    tasks.push({text});
    this.setState({tasks});
};

Como deve ser feito da melhor maneira possível?

Sujil Maharjan

Eu diria que a boa prática geral é lidar com todos os cenários que estão dentro do componente e não com as coisas que outros componentes enviarão. Por exemplo, no seu caso, é uma boa ideia testar que tipo de objeto está sendo enviado.

Portanto, você pode usar a função toHaveBeenCalledWithpara testar que tipo de dados é enviado. Construir uma proteção é sempre uma boa ideia.

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

Maneira correta de escrever loops para promessa.

Maneira correta de escrever a linha no arquivo?

Maneira correta de escrever um loop for aninhado?

Maneira correta de escrever consulta de junção sql para três tabelas

Qual é a maneira correta de escrever funções de endpoint para Mongoose com Express?

Qual é a maneira correta de escrever sinal(es) para receber IPNs do PayPal de 3 modelos diferentes

Maneira correta de escrever vários desserializadores Jackson personalizados para lidar com a herança

Qual é a maneira correta de escrever um teste do Minitest para um método que produz?

Esta é a maneira correta de escrever uma série de ponteiros?

A maneira correta de escrever duas variáveis iguais uma à outra

Maneira correta de escrever a função __repr__ com herança

Qual é a maneira correta de escrever HTML usando Javascript?

Maneira melhor / correta de escrever uma consulta complexa

Qual é a maneira correta de escrever funções encadeadas no Angular?

Esta é a maneira correta de escrever declarações IF em R?

Qual é a maneira correta de escrever vários fechamentos à direita no Swift?

Maneira correta de reescrever `curl ...` para perl

Maneira correta de reutilizar um componente no React?

Maneira correta de herdar os componentes React

A maneira correta de adicionar elementos no react?

Componente Typescript React - maneira correta de redux prop types para interromper avisos de TS

Qual é a maneira correta de fazer solicitações de API no React para componentes que atualizam?

Maneira correta de passar funções para manipuladores em componentes 'burros' no React

Maneira correta de passar parâmetros para buscar url no React Native?

Existe uma maneira correta de passar dados para um componente React a partir da página HTML?

Maneira correta de conectar eventos Websocket para atualizar meu React Component

Qual é a maneira correta de passar um token para axios do React?

Maneira "melhor" de escrever igualdade para opcionais

Como escrever a assinatura de tipo correta para Vect no Idris?

TOP lista

  1. 1

    R Shiny: use HTML em funções (como textInput, checkboxGroupInput)

  2. 2

    UITextView não está exibindo texto longo

  3. 3

    Dependência circular de diálogo personalizado

  4. 4

    Acessando relatório de campanhas na AdMob usando a API do Adsense

  5. 5

    Como assinar digitalmente um documento PDF com assinatura e texto visíveis usando Java

  6. 6

    R Folheto. Dados de pontos de grupo em células para resumir muitos pontos de dados

  7. 7

    Setas rotuladas horizontais apontando para uma linha vertical

  8. 8

    O Chromium e o Firefox exibem as cores de maneira diferente e não sei qual deles está fazendo certo

  9. 9

    Definir um clipe em uma trama nascida no mar

  10. 10

    Por que meus intervalos de confiança de 95% da minha regressão multivariada estão sendo plotados como uma linha de loess?

  11. 11

    Como dinamizar um Dataframe do pandas em Python?

  12. 12

    regex para destacar novos caracteres de linha no início e no fim

  13. 13

    Why isn't my C# .Net Core Rest API route finding my method?

  14. 14

    Como obter a entrada de trás de diálogo em treeview pyqt5 python 3

  15. 15

    Tabela CSS: barra de rolagem para a primeira coluna e largura automática para a coluna restante

  16. 16

    How to create dynamic navigation menu select from database using Codeigniter?

  17. 17

    Como recuperar parâmetros de entrada usando C #?

  18. 18

    Changing long, lat values of Polygon coordinates in python

  19. 19

    Livros sobre criptografia do muito básico ao muito avançado

  20. 20

    Método \ "POST \" não permitido no framework Django rest com ações extras & ModelViewset

  21. 21

    Pesquisa classificada, conte números abaixo do valor desejado

quentelabel

Arquivo