2
respostas

Erro em suite de testes com jest e react typescript

Ao realizar o seguinte teste:

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

describe('Header', () => {
  it('should render navigateMonths', async () => {
    const navigateMonths = render(<NavigateMonths />);
    expect(navigateMonths.getByTestId('navigateMonths')).toBeTruthy();
  });
});

Estou obtendo erro:

TypeError: The "data" argument must be of type string or an instance of Buffer, TypedArray, or DataView. Received an instance of Object
export const INITIAL_APP_STATE: AppState = {
      19 |   ...INITIAL_LEGACY_STATE,
    > 20 |   common: INITIAL_COMMON_STATE,
         | ^
      21 |   configPermissions: INITIAL_STATE_PERMISSION_CONFIG,
      22 |   offers: INITIAL_OFFER_STATE,
      23 |   onBoardingFinancialHealth: INITIAL_ONBOARDING_FINANCIAL_HEALTH_STATE,

o componente renderizado é o seguinte:

import moment from 'moment';
import { useStateContext } from '../../../../../common/hooks/context/stateContext';
import { Icon, Icons, Typography } from '../../../../../design';
import { globalCentralizedControl, homeCalendar, periodModel } from '../../../centralizedControl';
import { BankList } from '../../bankAccounts/list/bankList';
import { TotalBalance } from '../../bankAccounts/balance/totalBalance';

export const NavigateMonths: React.FC = () => {
  const { isMobile } = globalCentralizedControl;

  useStateContext(periodModel);

  const handlePreviousMonth = () => {
    homeCalendar.addPreviousWorkerDate();
    const [currentDate] = homeCalendar.workerCurrentDate;
    periodModel.currentPeriodScroll = currentDate;
  };

  const handleNextMonth = () => {
    homeCalendar.addNextWorkerDate();
    const [currentDate] = homeCalendar.workerCurrentDate;
    periodModel.currentPeriodScroll = currentDate;
  };

  const date = moment(periodModel.currentPeriodScroll).format('MMMM YYYY');
  const isVisible = periodModel.viewNavigateMonths || !isMobile;

  return (
    isVisible && (
      <div data-testid="navigateMonths" className="z-10 flex h-100 w-100 justify-between bg-neutral-high px-base pb-micro">
        {!isMobile && <BankList />}

        <div className="flex w-100 items-center justify-between md:w-[350px] md:gap-huge">
          <button type="button" onClick={handlePreviousMonth} className="rotate-180">
            <Icon type={Icons.ARROW_RIGHT} className="fill-neutral-low-300" size="xs" />
          </button>
          <Typography type="p" className="text-brand-primary-800" text={date} />
          <button type="button" onClick={handleNextMonth}>
            <Icon type={Icons.ARROW_RIGHT} className="fill-neutral-low-300" size="xs" />
          </button>
        </div>
        {!isMobile && <TotalBalance />}
      </div>
    )
  );
};

o arquivo main.tsx:

import './design/theme/index.css';
import './index.css';
import { createRoot } from 'react-dom/client';
import { Provider } from 'react-redux';
import { RoutesConfig } from './routes/config';
import { configStore } from './common/state/reducer';
import { INITIAL_STATE_PERMISSION_CONFIG } from './routes/state/state';
import { INITIAL_OFFER_STATE } from './app/lowToutch/reducer/offers/reducer';
import { INITIAL_ONBOARDING_FINANCIAL_HEALTH_STATE } from './app/onBoardingFinancialHealth/reducer/onBordingFinancialHealth/reducer';
import { INITIAL_UNDERSTANDING_BUSINESS_STATE } from './app/understandingBusiness/reducer/understandingBusiness/reducer';
import { AppState } from './common/state/state.types';
import { INITIAL_LEGACY_STATE } from './app/legacy/INITIAL_LEGACY_STATE';
import { Portals } from './common/portals/portals';
import { GlobalStyle } from './app/legacy/global/style';
import { INITIAL_COMMON_STATE } from './common/reducer/initialStateCommon';
import { INITIAL_STATE_BANK_INTEGRATION } from './app/bankIntegration/reducer/initialStateBankIntegration';

export const INITIAL_APP_STATE: AppState = {
  ...INITIAL_LEGACY_STATE,
  common: INITIAL_COMMON_STATE,
  configPermissions: INITIAL_STATE_PERMISSION_CONFIG,
  offers: INITIAL_OFFER_STATE,
  onBoardingFinancialHealth: INITIAL_ONBOARDING_FINANCIAL_HEALTH_STATE,
  understandingBusiness: INITIAL_UNDERSTANDING_BUSINESS_STATE,
  bankIntegration: INITIAL_STATE_BANK_INTEGRATION,
};

export const store = configStore(INITIAL_APP_STATE);
const container = document.getElementById('root');
const root = createRoot(container!);
root.render(
  <Provider store={store}>
    <RoutesConfig />
    <Portals />
    <GlobalStyle />
  </Provider>
);

babel.rc:

{
  "env": {
    "test": {
      "plugins": ["transform-object-rest-spread"]
    }
  }
}

babel.config.js:

module.exports = {
  plugins: ['transform-object-rest-spread'],
  presets: [
    [
      '@babel/preset-env',
      {
        targets: {
          node: 'current',
        },
      },
    ],
    '@babel/preset-react',
  ],
};
2 respostas

Continuando a explicação, caso eu faça qualquer tipo de teste de componente obtenho este erro, mas caso eu remova o teste de componente, funciona normalmente, alem de que a aplicação esta funcionando quando lanço npm run dev com vite. Em seguida deixo o jest-config.js:

module.exports = {
  roots: ['<rootDir>/src'],
  collectCoverageFrom: ['src/**/*.{js,jsx,ts,tsx}', '!src/**/*.d.ts', '!src/mocks/**'],
  coveragePathIgnorePatterns: [],
  setupFilesAfterEnv: ['./config/jest/setupTests.js', './src/__mocks__/env.ts'],
  testEnvironment: 'jsdom',
  modulePaths: ['<rootDir>/src'],
  transform: {
    '^.+\\.(ts|js|tsx|jsx)$': '@swc/jest',
    '^.+\\.css$': '<rootDir>/config/jest/cssTransform.js',
    '^(?!.*\\.(js|jsx|mjs|cjs|ts|tsx|css|json)$)': '<rootDir>/config/jest/fileTransform.js',
    '^.+\\.tsx?$': 'babel-jest',
  },
  transformIgnorePatterns: ['[/\\\\]node_modules[/\\\\].+\\.(js|jsx|mjs|cjs|ts|tsx)$', '^.+\\.module\\.(css|sass|scss)$'],
  modulePaths: ['<rootDir>/src'],
  moduleNameMapper: {
    '^react-native$': 'react-native-web',
    '^.+\\.module\\.(css|sass|scss)$': 'identity-obj-proxy',
  },
  moduleFileExtensions: [
    // Place tsx and ts to beginning as suggestion from Jest team
    // https://jestjs.io/docs/configuration#modulefileextensions-arraystring
    'tsx',
    'ts',
    'web.js',
    'js',
    'web.ts',
    'web.tsx',
    'json',
    'web.jsx',
    'jsx',
    'node',
  ],
  watchPlugins: ['jest-watch-typeahead/filename', 'jest-watch-typeahead/testname'],
  resetMocks: true,
};

Olá Felix! Tudo ok contigo?

O erro que você está enfrentando parece estar relacionado à configuração e ambiente de teste no Jest em seu projeto React TypeScript.

Ele geralmente ocorre quando você está tentando passar um objeto (instance of Object) onde o Jest espera uma string ou um tipo de dado compatível, como Buffer, TypedArray ou DataView. Isso indica que o erro não está diretamente relacionado ao seu componente NavigateMonths, mas possivelmente a alguma configuração ou dependência do Jest.

Vamos analisar algumas possíveis causas e soluções:

1. Configuração do Jest:

O arquivo jest-config.js que você forneceu parece estar em ordem. Ele define a configuração do Jest, incluindo os transformadores necessários para arquivos TypeScript e JavaScript. No entanto, vale a pena verificar se todas as dependências do Jest estão corretamente instaladas e se não há conflitos entre as versões das dependências.

2. Ambiente de Teste:

O erro menciona que o ambiente de teste é 'jsdom', que é a configuração padrão para testes de front-end com React. Isso parece correto. No entanto, é importante verificar se não há problemas com as configurações de ambiente de teste, como variáveis de ambiente ausentes ou incorretas.

3. Dependências e Módulos Faltantes:

Certifique-se de que todas as dependências necessárias estejam instaladas e atualizadas corretamente, especialmente aquelas relacionadas ao Jest e ao ambiente de teste. Você pode verificar suas dependências executando:

npm ls jest @swc/jest @babel/preset-env @babel/preset-react

Se alguma delas estiver desatualizada ou ausente, você pode atualizá-las ou instalá-las usando o comando npm install.

4. Configuração de Babel:

Verifique se a configuração do Babel está correta. Você já forneceu o arquivo babel.config.js, que parece estar configurado corretamente para transpilar TypeScript e JavaScript. No entanto, certifique-se de que não haja conflitos com outras configurações do Babel em seu projeto.

5. Uso de @testing-library/react:

A função render que você está usando para renderizar o componente NavigateMonths é proveniente da biblioteca @testing-library/react. Certifique-se de que esta biblioteca esteja corretamente instalada e configurada em seu projeto. Você pode instalá-la usando o seguinte comando:

npm install --save @testing-library/react

6. Configuração do Projeto:

Verifique se a estrutura do seu projeto e a organização de pastas estão corretas. Certifique-se de que o arquivo que você está testando (navigateMonths.tsx) está no local esperado e que não há problemas de importação.

7. Possíveis Causas Internas:

O erro pode estar relacionado a alguma lógica interna do seu aplicativo que é acionada durante o teste, mas não durante a execução normal. Certifique-se de que o estado do aplicativo esteja configurado de forma adequada antes do teste, e que não há problemas de inicialização de estado dentro do componente NavigateMonths.

8. Testes Isolados:

Às vezes, problemas em outros testes ou configurações podem afetar o teste atual. Tente isolar o teste em questão, desabilitando outros testes temporariamente para ver se o problema persiste. Isso pode ajudar a identificar se o erro está relacionado a este teste específico ou a configurações globais.

Aqui está um exemplo de como você pode isolar temporariamente o teste:

describe('Header', () => {
  it.only('should render navigateMonths', async () => { // Use "it.only" para executar apenas este teste
    const navigateMonths = render(<NavigateMonths />);
    expect(navigateMonths.getByTestId('navigateMonths')).toBeTruthy();
  });
});

9. Debugging:

Se todas as outras tentativas de solução não funcionarem, você pode adicionar instruções de log ou usar ferramentas de depuração, como o Debugger do VSCode ou o DevTools do navegador, para investigar mais a fundo o que está acontecendo durante o teste e onde o erro está ocorrendo.

Espero que essas dicas tenham sido úteis para ajudá-lo a solucionar o erro em sua suíte de testes com Jest e React TypeScript. Certifique-se de verificar cada uma delas e seguir as melhores práticas de teste para garantir que seu código seja testado de forma confiável e eficaz.

Era isso. Espero ter ajudado!

Abraços e bons estudos!