Skip to content

Instantly share code, notes, and snippets.

@igr-santos
Last active May 4, 2018 12:59
Show Gist options
  • Save igr-santos/26c1a88b52820a7ce8e01a1b76c7a856 to your computer and use it in GitHub Desktop.
Save igr-santos/26c1a88b52820a7ce8e01a1b76c7a856 to your computer and use it in GitHub Desktop.
Um guia para uso do AVA como test runner de projetos com Create React APP

Create React APP + AVA Test Runner

Create React App

AVA Test Runner

  1. Criar um projeto react com Create React APP (https://github.com/facebook/create-react-app#quick-overview)
npx create-react-app [nome do seu projeto]
  1. Ejetar configurações do Create React APP.

Isso vai ser util para realizar a troca do Test Runner, do Jest para o AVA

yarn eject
  1. Remover o Test Runner atual (Jest) e suas configurações do package.json
yarn remove jest --save
rm -rf config/jest/
rm -f scripts/test.js
  1. Adicionar o AVA Test Runner

Eu não obtive sucesso ao tentar usar a versão beta do AVA, ele não reconheceu algumas configurações do Babel, e por esse motivo nós vamos usar a última versão instável AVA v0.25.0

yarn add [email protected] --dev

É necessário alterar o comando de test para que passe a utilizar o AVA como Test runner, os scripts do seu package.json devem ficar da seguinte forma:

// ...
"scripts": {
  "start": "node scripts/start.js",
  "build": "node scripts/build.js",
  "test": "NODE_ENV=test ava"
},
// ...
  1. Configurando o AVA para executar testes em ES6.

Existem várias configurações que podem ser feitas no AVA, você encontra todas elas na documentação, mas a mais importante neste momento sáo as configurações babel e require

  • require: é responsável por carregar módulos antes dos testes, quando dizemos módulos estamos falando de um pacote NPM ou um arquivo de setup inicial.

  • babel: configuração de babel especifica para os testes, usaremos a opção inherit, que utiliza a configuração padrão do babel aplicada em seu projeto.

Instale o babel-register

yarn add babel-register

e adicione a seguinte configuração no seu package.json:

"ava": {
  "require": [
    "babel-register" 
  ],
  "babel": "inherit"
},

IMPORTANTE: Nós não vamos entrar no mérito da configuração para carregamento do CSS ou SVG, mas isso pode ser feito de acordo com seu gosto, então para que possamos seguir com nosso setup, remova as importações de qualquer arquivo que não seja JS de dentro do src/App.js.

  1. Escrevendo testes com AVA

Após realizar a configuração necessária, perceba que ao rodar o comando de teste yarn test, ainda temos o seguinte erro:

ReferenceError: it is not defined

Isso porque o AVA tem sua maneira de escrever testes, que deixa explicito o import das funções utilizadas, refatore o arquivo src/App.test.js. Você pode ver como escrever testes em AVA na documentação

Mesmo refatorando seu teste, você ainda vai obter o seguinte erro:

ReferenceError {
  message: 'window is not defined',
}

Isso é porque o AVA é um test runner, e você precisa simular a DOM para conseguir testar componentes React, pra isso a gente vai utilizar o JSDOM e vamos adicionar o setup inicial dos testes naquela configuração de require do AVA.

Instalando JSDOM:

yarn add --dev jsdom

Crie um arquivo config/setupTest.js com a seguinte configuração:

/* eslint-env browser */ 
// browser
const { JSDOM } = require('jsdom');
const dom = new JSDOM(`<body></body>`);
 
global.document = dom.window.document;
global.window = dom.window;
global.navigator = dom.window.navigator;

E adicione a referência deste arquivo ao seu package.json no require, e sua configuração AVA passa a ser:

"ava": {
  "require": [
    "babel-register",
    "./config/polyfills.js",
    "./config/setupTest.js"  
  ],
  "babel": "inherit"
},

Neste momento você já consegue escrever seus testes com AVA, eu recomendo para realizar testes mais precisos nos componentes o uso do Enzyme.

Esse gist gerou um projeto de exemplo que pode ser acessado em (https://github.com/igr-santos/create-react-app-ava)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment