Repositório possuí projeto desenvolvido no período que estive na Trybe, abordando sobre conceitos de testes unitários para garantir que as implementações das funções estejam corretas.
- Este é um projeto desenvolvido para aprender
Jest
; - Este é um projeto desenvolvido para praticar
JavaScript
; - Primeiro projeto utilizando
Jest
- Utilizei a extensão Code Runner executar minhas funções.
Neste projeto, implementei várias funções na resolução dos requisitos propostos e/ou testes unitários para garantir que as implementações das funções estão corretas, de acordo com o que está sendo solicitado em cada enunciado.
- Escrever testes unitários utilizando o módulo Jest do NodeJS para verificar o correto funcionamento das funções;
- Escrever funções de forma que elas atendam a testes já implementados;
- Escrever testes e funções utilizando uma abordagem de desenvolvimento orientado a testes.
-
Clone o repo:
git clone git@github.com:Ludson96/project-js-unit-tests.git
-
Entre na pasta do repositório que você acabou de clonar:
cd project-js-unit-tests
-
Instale as dependências:
npm install
-
Todas as funções se encontram na pasta
src
para executar os testes basta usar o comandonpm test
para executar todos os testes ounpm test <nome do teste>
para executar um teste especifico. -
Abaixo segue os requisitos fornecidos pela Trybe
A função average recebe um array de tamanho variável e retorna a média dos valores recebidos. Caso a função receba algum valor não numérico ou um array vazio, o valor `undefined` deve ser retornado.
Todos os resultados devem ser arredondados para valores inteiros. Ex: 4,6 vira 5; 1,3 vira 1. O arquivo average.spec.js
contém os testes para average
já implementados. Implemente a função no arquivo src/average.js
de forma que ela atenda aos testes propostos.
O que será testado:
- Será validado se, ao receber um array de números, a função
average
retorna a média de seus valores; - Será validado se, ao receber um array que contém valores não numéricos, a função
average
retornaundefined
; - Será validado se, ao receber um array vazio, a função
average
retornaundefined
.
A função `numbers` recebe um array de tamanho variável e retorna `true` se todos os parâmetros forem do tipo 'number' e `false` caso contrário.
Essa função já está implementada no arquivo src/numbers.js
. Escreva pelo menos quatro testes para essa função para garantir que a implementação de numbers
está correta.
O que será testado:
- Será validado se no teste da função
numbers
, o retorno da função étrue
quando o array passado por parâmetro contém somente números.
Use template literals para escrever uma função que recebe o seu nome e a sua idade e retorna o parágrafo descrito abaixo:
`Oi, meu nome é Tunico!
Tenho 30 anos,
trabalho na Trybe e mando muito em programação!
#VQV!`
Caso a função seja chamada sem nenhum parâmetro, o valor undefined
deve ser retornado. O arquivo vqv.spec.js
contém os testes para vqv
já implementados. Implemente a função no arquivo src/vqv.js
de forma que ela atenda aos testes propostos.
O que será avaliado
- Será validado se
vqv
é uma função; - Será validado se a função
vqv
retorna dados do tipo string; - Será validado se a função
vqv
retorna a frase esperada quando passados parâmetros de nome e idade; - Será validado se a função
vqv
, quando chamada sem parâmetro, retornaundefined
.
A função `circle` recebe o raio de um círculo e retorna um objeto contendo as suas informações: Raio, Área e Circunferência. Se não for especificado um raio, a função retorna `undefined`.
Essa função já está implementada no arquivo src/circle.js
. Escreva pelo menos seis testes para essa função para garantir que a implementação de circle
está correta.
O que será avaliado
- Será validado se no teste da função
circle
, ao receber um raio, o retorno da função é um objeto com as informações corretas (Raio, Área e Circunferência).
A função `createStudent` recebe como parâmetro um **nome**, e retorna um objeto contendo duas chaves:
- name, contendo o nome passado como parâmetro;
- feedback, contendo uma função que retorna a frase 'Eita pessoa boa!' ao ser chamada.
O arquivo createStudent.spec.js
contém os testes para createStudent
já implementados. Implemente a função no arquivo src/createStudent.js
de forma que ela atenda aos testes propostos.
O que será avaliado
- Será validado se a função
createStudent
retorna um objeto que contenha duas chaves:name
, contendo o nome passado como parâmetro; efeedback
, contendo uma função que retorna a frase 'Eita pessoa boa!' ao ser chamada.
A função `productDetails` recebe duas strings que representam nomes de produtos, e retorna um array contendo dois objetos com os detalhes dos respectivos produtos:
productDetails('Alcool gel', 'Máscara');
Retorna:
[
{
name: 'Alcool gel'
details: {
productId: 'Alcool gel123'
}
},
{
name: 'Máscara'
details: {
productId: 'Máscara123'
}
}
]
Essa função já está implementada no arquivo src/productDetails.js
. Escreva pelo menos cinco testes para essa função no arquivo tests/productDetails.js
para garantir que a implementação de productDetails
está correta.
O que será avaliado
- Será validado se no teste da função
productDetails
, ao receber duas strings, o retorno da função é um array de objetos e se cada objeto contém os dados necessários.
A função `calculator` recebe dois números inteiros como parâmetro e retorna um objeto com as seguintes chaves:
- sum; - mult; - div; - sub.
Para cada chave atribua como valor a operação correspondente à sua chave:
sum:
retorna o resultado da soma dos dois números;mult:
retorna o resultado da multiplicação dos dois números;div:
retorna o resultado da divisão dos dois números;sub:
retorna o resultado da subtração dos dois números.
Os resultados das divisões devem sempre ser arredondados para baixo.
Parâmetros:
- Dois números inteiros.
Comportamento:
calculator(1, 2); // { sum: 3, mult: 2, div: 0, sub: -1 }
Já a função arrayGenerator
converte objetos em arrays, de chaves, valores ou ambos. Ela deve receber dois parâmetros:
- o primeiro parâmetro deve ser uma string que indica o tipo de conversão;
- o segundo parâmetro deve ser um objeto semelhante ao que é retornado pela função calculator que você acabou de desenvolver.
Parâmetros:
- Uma string que indica o tipo de conversão;
- Um objeto no formato { sum: 3, mult: 2, div: 0, sub: -1 };
Comportamento:
arrayGenerator('keys', { sum: 3, mult: 2, div: 1, sub: 0 }) // [ 'sum', 'mult', 'div', 'sub' ]
arrayGenerator('values', { sum: 3, mult: 2, div: 1, sub: 0 }) // [ 3, 2, 1, 0 ]
arrayGenerator('entries', { sum: 3, mult: 2, div: 1, sub: 0 }) // [ [ 'sum', 3 ], [ 'mult', 2 ], [ 'div', 1 ], [ 'sub', 0 ] ]
O arquivo objPlayground.spec.js
contém os testes para calculator
e arrayGenerator
já implementados. Implemente as funções no arquivo src/objPlayground.js
de forma que ela atenda aos testes propostos.
O que será avaliado
- Será avaliado se a função
calculator
retorna os valores esperados; - Será avaliado se a função
arrayGenerator
retorna os valores esperados.
A função myCounter possui dois loops aninhados que inserem valores dentro de um array. Como podemos perceber, eles vão adicionando valores ao array até sua condição de parada.
Corrija a função myCounter
, sem eliminar nenhum dos loops de repetição, para que a função retorne o array correto. O arquivo myCounter.spec.js
contém os testes para myCounter
já implementados. Implemente a função no arquivo src/myCounter.js
de forma que ela atenda aos testes propostos.
O que será avaliado
- Será validado se a função
myCounter
retorna os dados esperados de acordo com o que está implementado no teste.
A função `getCharacter` recebe uma string que representa o nome de uma personagem e retorna um objeto contendo o seu nome, a sua classe e as suas frases.
getCharacter('Arya');
Retorna:
{
name: 'Arya Stark',
class: 'Rogue',
phrases: ['Not today', 'A girl has no name.']
}
Essa função já está implementada no arquivo src/getCharacter.js
. Escreva pelo menos seis testes para essa função no arquivo tests/getCharacter.spec.js
para garantir que a implementação de getCharacter
está correta.
O que será avaliado
- Será validado se no teste da função
getCharacter
ao receber uma string, o retorno da função é o esperado - de acordo com a tabela apresentada no arquivo de testes. - Será validado se no teste da função
getCharacter
ao não receber nenhum parâmetro, o retorno da função éundefined
. - Será validado se o teste da função
getCharacter
verifica se o parâmetro é case sensitive.
Esse último requisito vai guiar você por um rico processo de Desenvolvimento Orientado a Testes ou TDD - Test Driven Development
Imagine a seguinte situação: você é responsável por escrever o código do sistema de pedidos de um restaurante através do qual será possível cadastrar um menu. Dado que um menu foi cadastrado, o sistema deve disponibilizar um objeto que permite:
- Ler o menu cadastrado;
- Fazer pedidos;
- Verificar o que foi pedido;
- Somar o valor da conta.
A estrutura deste código e deste objeto já está definida e você precisa implementá-la. Você encontrará mais detalhes sobre a estrutura a ser seguida e exemplos do retorno da função no arquivo src/restaurant.js
.
Você deverá se orientar através dos tópicos abaixo para garantir o bom desenvolvimento do sistema.
IMPORTANTE - BOAS PRÁTICAS TDD: COMECE PELO TESTE 1 DO ARQUIVO tests/restaurant.spec.js
Se surgirem dúvidas, não deixe de consultar o nosso conteúdo sobre TDD.
-
No arquivo
tests/restaurant.spec.js
, escreva um teste que verifica se a funçãocreateMenu()
retorna um objeto que possui a chavefetchMenu
, a qual tem como valor uma função. -
No arquivo
tests/restaurant.spec.js
, escreva um teste que verifica se'objetoRetornado.fetchMenu()'
retorna um objeto cujas chaves são somentefood
edrink
, considerando que a funçãocreateMenu()
foi chamada com o objeto:{ food: {}, drink: {} }
. -
No arquivo
tests/restaurant.spec.js
, escreva um teste que verifica se o menu passado pra funçãocreateMenu()
é idêntico ao menu recuperado pela função'objetoRetornado.fetchMenu()'
. -
No arquivo
src/restaurant.js
, crie uma funçãocreateMenu()
que, recebendo um objeto como parâmetro, retorna esse objeto com o seguinte formato: { fetchMenu: () => objetoPassadoPorParametro }. -
No arquivo
tests/restaurant.spec.js
, escreva um teste que verifica se'objetoRetornado.consumption'
, após a criação do menu, retorna um array vazio. -
No arquivo
src/restaurant.js
, adicione ao objeto retornado porcreateMenu()
uma chaveconsumption
que, como valor inicial, tem um array vazio. -
No arquivo
tests/restaurant.spec.js
, escreva um teste que verifica se ao chamar uma função associada à chaveorder
no objeto retornado, passando uma string como parâmetro (comoobjetoRetornado.order('coxinha')
), tal string é adicionada ao array retornado emobjetoRetornado.consumption
. -
No arquivo
src/restaurant.js
, crie uma função, separada da funçãocreateMenu()
, que, ao receber uma string como parâmetro, adiciona essa string ao array deobjetoRetornado.consumption
. Essa nova função será adicionada à chaveorder
. -
No arquivo
tests/restaurant.spec.js
, escreva um teste que verifica se ao adicionar três pedidos, dentre bebidas e comidas, o arrayobjetoRetornado.consumption
contém os itens pedidos. -
No arquivo
tests/restaurant.spec.js
, escreva um teste que verifica se a funçãoorder
aceita que pedidos repetidos sejam acrescidos aconsumption
. -
No arquivo
tests/restaurant.spec.js
, escreva um teste que verifica que, ao chamarobjetoRetornado.pay()
, retorna-se a soma dos preços de tudo que foi pedido, conforme registrado emobjetoRetornado.consumption
. -
No arquivo
src/restaurant.js
, adicione ao objeto retornado porcreateMenu()
uma chavepay
com uma função que percorre por todos os itens deobjetoRetornado.consumption
, soma o preço deles e retorna o valor somado acrescido de 10%. DICA: para isso, você precisará percorrer tanto o objeto da chavefood
quanto o objeto da chavedrink
.
O que será avaliado
- Será validado se a função
createMenu()
retorna os dados esperados. - Será validado se o teste da função
createMenu()
verifica cada um dos retornos da função e se estes retornos têm o comportamento esperado.