Skip to content

Commit

Permalink
Finish exercise 2
Browse files Browse the repository at this point in the history
  • Loading branch information
pedrolacerda committed Mar 13, 2021
1 parent 22c9b64 commit 23214cf
Show file tree
Hide file tree
Showing 11 changed files with 1,973 additions and 154 deletions.
2 changes: 1 addition & 1 deletion exercicios/01.exercicio-ESLint.md
Expand Up @@ -118,7 +118,7 @@ Recarregue o VS Code.

Abra o arquivo `app.js`, clique com o botão direito e selecione a opção `Command Palette...`. Digite `ESLint` e selecione a opção `ESLint: Fix all auto-fixable Problems`.

Voilà
**Voilà**

![voilà](https://media.giphy.com/media/kFONSfnHQSEX2NOrh7/source.gif)

Expand Down
183 changes: 181 additions & 2 deletions exercicios/02.exercicio-testes-unitarios.md
Expand Up @@ -4,6 +4,185 @@ Siga as instruções abaixo para instalar as ferramentas utilizadas para melhora

## 2. Implementando Testes Unitários

## 3. Implementando Stubs e Mocks
Para executar nossos testes unitários, vamos utilizar as bibliotecas [`mocha`](https://mochajs.org/) e [`Chai`](https://www.chaijs.com/).

## 4. Analisando Cobertura de Testes
### 2.1 Instalando e configurando as bibliotecas

Execute o seguinte comando:

```bash
npm install -D mocha chai
```

Em seguida, abra o arquivo `package.json` e, na linha 13, abaixo de `"eslin"` adicione:

```json
"test": "mocha",
```

O seu objeto `scripts` deve ficar assim:

```json
"scripts": {
"debug": "cross-env DEBUG=restaurant-reservation:* nodemon",
"eslint": "eslint",
"test": "mocha",
"start": "node bin/www"
},
```

Agora vamos criar um arquivo de configuração do ESLint para os nossos testes. Crie uma pasta `test` e, dentro dela, outro arquivo chamado `.eslintrc.js` com o seguinte conteúdo:

```javascript
module.exports = {
"env": {
"mocha": true
},
"rules": {
"no-unused-vars": [
"error",
{
"varsIgnorePattern": "should|expect"
}
]
}
}
```

Precisamos informar ao `mocha` que ele deve buscar recursivamente por arquivos de testes na pasta `test`. Para isso, altere a linha 13 do arquivo `package.json` para que o script **test** seja `"test": "mocha --recursive",`. Seu objeto `scripts` deve ficar assim:

```json
"scripts": {
"debug": "cross-env DEBUG=restaurant-reservation:* nodemon",
"eslint": "eslint",
"test": "mocha --recursive",
"start": "node bin/www"
},
```

### 2.2 Escrevendo testes unitários

Para implementar testes unitários, devemos escolher partes do código que funcionem independentes de outras funções e que não sejam código de terceiros.

No nosso caso vamos utilizar como exemplo o arquivo `./lib/schema/reservation.js`. Mais especificamente a função `combineDateTime`. Por alguns motivos:

- Atômica
- Não interage com nenhum serviço
- Assinatura e estrutura consistentes

Nossos testes ficarão dentro da pasta `test`. Que terá uma réplica da estrutura de pastas do nosso projeto. Crie o seguinte arquivo `./test/unit/lib/schema/reservation.js`. Vamos preencher o seu conteúdo em breve.

Mocha também nos permite testar código assíncrono. Podemos testar tanto callbacks quanto promises. Nosso melhor candidato é validador da reserva. Adicione o seguinte código ao arquivo de testes `./test/unit/lib/schema/reservation.js` que acabamos de criar:

```javascript
const chai = require('chai');
const should = chai.should();
const Reservation = require('../../../../lib/schema/reservation');

describe('Reservation Schema', function() {
context('Date and Time Combination', function() {
it('should return a ISO 8601 date and time with valid input', function() {
const date = '2017/06/10';
const time = '06:02 AM';

Reservation.combineDateTime(date, time)
.should.equal('2017-06-10T06:02:00.000Z');
});

it('should return null on a bad date and time', function() {
const date = '!@#$';
const time = 'fail';

should.not.exist(Reservation.combineDateTime(date, time));
});
});

context('Validator', function() {
it('should pass a valid reservation with no optional fields', function(done) {
const reservation = new Reservation({
date: '2017/06/10',
time: '06:02 AM',
party: 4,
name: 'Family',
email: 'username@example.com'
});

reservation.validator(function(error, value) {
value.should.deep.equal(reservation);
done(error);
});
});

it('should fail a reservation with a bad email', function(done) {
const reservation = new Reservation({
date: '2017/06/10',
time: '06:02 AM',
party: 4,
name: 'Family',
email: 'username'
});

reservation.validator(function(error) {
error.should
.be.an('error')
.and.not.be.null;
done();
});
});
});
});
```

Em seguida, rode os testes novamente e veja os resultados:

```bash
npm test
```

:question: Por quê o teste não passou?
<!-- É preciso alterar o arquivo `lib/schema/reservation.js` na linha 51 para que o validador valide se o formato é de email e não se o tamanho é 255
`email: Joi.string().email().required(),`
-->

Por fim, vamos criar testes para as promisses, mais especificamente para o arquivo `./lib/reservations.js`. Crie o arquivo `./test/unit/lib/reservations.js` e adicione o seguinte conteúdo:

```javascript
const chai = require('chai');
const should = chai.should();
const Reservation = require('../../../lib/schema/reservation');
const reservations = require('../../../lib/reservations');

describe('Reservations Library', function() {
context('Validate', function() {
it('should pass a valid reservation with no optional fields', function() {
const reservation = new Reservation({
date: '2017/06/10',
time: '06:02 AM',
party: 4,
name: 'Family',
email: 'username@example.com'
});

return reservations.validate(reservation)
.then(actual => actual.should.deep.equal(reservation));
});

it('should fail an invalid reservation with a bad email', function() {
const reservation = new Reservation({
date: '2017/06/10',
time: '06:02 AM',
party: 4,
name: 'Family',
email: 'username'
});

return reservations.validate(reservation)
.catch(error => error.should.be.an('error').and.not.be.null);
});
});
});
```

## Próxima seção

Avançar para exercício [03. Implementando Stubs e Mocks](03.exercicio-stubs-mocks.md)
9 changes: 9 additions & 0 deletions exercicios/03.exercicio-stubs-mocks.md
@@ -0,0 +1,9 @@
# Exercícios práticos sobre teste de software

Siga as instruções abaixo para instalar as ferramentas utilizadas para melhorar a qualidade da aplicação.

## 3. Implementando Stubs e Mocks

## Próxima seção

Avançar para exercício [04. Analisando Cobertura de Testes](04.exercicio-cobertura.md)
5 changes: 5 additions & 0 deletions exercicios/04.exercicio-cobertura.md
@@ -0,0 +1,5 @@
# Exercícios práticos sobre teste de software

Siga as instruções abaixo para instalar as ferramentas utilizadas para melhorar a qualidade da aplicação.

## 4. Analisando Cobertura de Testes
2 changes: 1 addition & 1 deletion lib/schema/reservation.js
Expand Up @@ -48,7 +48,7 @@ module.exports = class Reservation {
datetime: Joi.date().iso().required().raw(),
party: Joi.number().min(1).max(7).required(),
name: Joi.string().max(255).required(),
email: Joi.string().max(255).required(),
email: Joi.string().email().required(),
phone: Joi.string().max(50).allow(''),
message: Joi.string().max(1000).allow(''),
});
Expand Down

0 comments on commit 23214cf

Please sign in to comment.