#VemProReact #JEP #10

#VemProReact

Correção da atividade!

src/lib/components

#VemProReact

Correção da atividade!

Dados.styles.js

export const styles = {
  grid: {
    width: '100%',
    padding: '12px 24px'
  },
  title: {
    textTransform: 'uppercase'
  },
  form: {
    width: '100%'
  },
  button: {
    marginTop: '12px'
  }
};

#VemProReact

Correção da atividade!

LotacaoPrincipal.styles.js

export const styles = {
  grid: {
    width: '100%',
    padding: '12px 24px'
  },
  title: {
    textTransform: 'uppercase'
  }
};

App.styles.js

import { styled } from '@bayon/commons';

export const EmptyStateContainer = styled('div')({
  height: 'calc(100vh - 48px)'
});

#VemProReact

Correção da atividade!

...

"jest": {
  "coverageThreshold": {
    "global": {
      "statements": 0,
      "branches": 0,
      "functions": 0,
      "lines": 0
    }
  },
  "collectCoverageFrom": [
    "src/**/*.js",
    "!src/dev/**",
    "!src/lib/services/graphql/**",
    "!src/lib/setupTests.js"
  ]
}

...

package.json

#VemProReact

Correção da atividade!

import React from 'react';

// RTL
import { render } from '@testing-library/react';

// Components
import LotacaoPrincipal from '../LotacaoPrincipal';

describe('LotacaoPrincipal component', () => {
  test('Should renders the component', () => {
    const { container } = render(<LotacaoPrincipal foro={{}} />);

    expect(container).toBeDefined();
  });
});

LotacaoPrincipal.test.js

#VemProReact

Mocks

  • Providers
     
  • Hooks / HOCs
     
  • Components
     
  • Props
     
  • Queries / Mutations
     
  • Timers

#VemProReact

Mocks / Providers

Real Providers

...

import { render } from '@testing-library/react';

import { ToastProvider } from '@bayon/commons';

...

describe('Dados component', () => {
  test('Should renders the component', async () => {
    const { container } = render(
      <ToastProvider maxSnack={3}>
        ...
        <Dados {...props} />
        ...
      </ToastProvider>
    );

    expect(container).toBeDefined();
  });
});

#VemProReact

Mocks / Providers

Fake Providers

import { render } from '@testing-library/react';

import { MockedProvider } from '@apollo/react-testing';

describe('Dados component', () => {
  test('Should renders the component', async () => {
    const { container } = render(
      <MockedProvider mocks={[]} addTypename={false}>
        ...
        <Dados {...props} />
        ...
      </MockedProvider>
    );

    expect(container).toBeDefined();
  });
});

#VemProReact

Mocks / Hooks / HOCs

setupTests.js / MyComponent.test.js

setupTests.js / MyComponent.test.js

jest.mock('@bayon/i18n', () => ({
  useTranslation: () => ({
    t: key => key,
    i18n: {}
  })
}));
jest.mock('@bayon/i18n', () => ({
  withTranslation: () => Component => {
    Component.defaultProps = {
      ...Component.defaultProps,
      t: key => key,
      i18n: {}
    };

    return Component;
  }
}));

#VemProReact

Mocks / Components

Dados.test.js

jest.mock('./components/SelectCargo', () => () => 'SelectCargo');

#VemProReact

Mocks / Props

Dados.test.js

...

let props;

describe('Dados component', () => {
  beforeEach(() => {
    props = {
      usuario: {}
    };
  });

  test('Should renders the component', async () => {
    const { container } = render(
      <MockedProvider mocks={[]} addTypename={false}>
        <ToastProvider maxSnack={3}>
          <Dados {...props} />
        </ToastProvider>
      </MockedProvider>
    );

    expect(container).toBeDefined();
  });
});

#VemProReact

Mocks / Queries

SelectCargo.test.js

import { MockedProvider } from '@apollo/react-testing';
import { GET_CARGOS } from '../../../../services/graphql/queries';

const mocks = [
  {
    request: {
      variables: { nome: '' },
      query: GET_CARGOS
    },
    result: {
      data: {
        cargos: {
          items: [
            {
              id: 4,
              descricao: 'Coordenador'
            }
          ]
        }
      }
    }
  }
];
...
<MockedProvider mocks={mocks} addTypename={false}>
...

#VemProReact

Mocks / Mutations

Dados.test.js

import { MockedProvider } from '@apollo/react-testing';
import { UPDATE_USUARIO } from '../../services/graphql/mutations';

const mocks = [
  {
    request: {
      variables: { ... },
      query: UPDATE_USUARIO
    },
    result: {
      data: {
        update_usuario: {
          id: 'KAZUMI',
          nome: 'Kazumi Futatsugi (Softplan - SC)',
          documento: '123456789',
          genero: 'FEMININO',
          ...
        }
      }
    }
  }
];
...
<MockedProvider mocks={mocks} addTypename={false}>
...

#VemProReact

Mocks / Timers

debounce.test.js

import debounce from './debounce';

jest.useFakeTimers();

describe('debounce util', () => {
  test('Should execute callback function', () => {
    const callback = jest.fn();

    debounce(callback, 350)();

    expect(callback).not.toHaveBeenCalled();

    jest.runAllTimers();

    expect(callback).toHaveBeenCalled();
  });
});

#VemProReact

Jest

#DicasDeOuro 🥇

#VemProReact

Jest

Executar todos os testes de um arquivo:

Executar todos os testes de uma pasta:

Executar somente um teste do arquivo:

Ignorar testes do arquivo:

yarn test SelectCargo.test.js
yarn coverage SelectCargo.test.js
yarn test Dados
yarn coverage Dados
test.only('Should renders the component', () => { ...
test.skip('Should renders the component', () => { ...

#VemProReact

RTL

#DicasDeOuro 🥇

#VemProReact

RTL

SelectCargo.test.js

...

test.only('Should renders the component', () => {
  const { container, debug } = render(
    <MockedProvider mocks={[]} addTypename={false}>
      <SelectCargo {...props} />
    </MockedProvider>
  );

  debug();

  expect(container).toBeDefined();
});

...

#VemProReact

RTL

SelectCargo.test.js

#VemProReact

Dúvidas?

#VemProReact

Atividade!

  1. Atualizar todos os pacotes do projeto
  2. Excluir todos os arquivos .styles.js do cálculo do coverage
  3. Criar um mock para as props do componente LotacaoPrincipal
  4. Criar os testes necessários para atingir 100% de cobertura do componente SelectCargo
  5. Criar o teste básico de renderização do componente Dados
  6. Criar os testes necessários para atingir 100% de cobertura da função debounce

#VemProReact

#Desafio!

Criar os testes necessários para atingir 100% de cobertura do componente Dados

#VemProReact

Obrigado!

#VemProReact #JEP #10

By Softplan Planejamento e Sistemas

#VemProReact #JEP #10

Mocks; Dicas Jest; Dicas RTL; #desafio

  • 294