> For the complete documentation index, see [llms.txt](https://jorgeguerrabrazil-github.gitbook.io/curso-no-mongoose/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jorgeguerrabrazil-github.gitbook.io/curso-no-mongoose/um-curso-sintetico-em-jest/primeiro-passados.md).

# Primeiros passos

Vamos aprender o básico do Jest.

## Introdução

"Minha família inteira é da área médica. Um jantar de fim de semana em casa parece mais um daqueles episódios de seriados médicos da televisão: pessoas discutindo casos e como resolvê-los. Apesar de entender praticamente nada sobre medicina, uma coisa me chama muito a atenção: o fanatismo deles por qualidade. Um médico, ao longo de uma cirurgia, nunca abre mão de qualidade. Se o paciente falar para ele: “Doutor, o senhor poderia não lavar a mão e terminar a cirurgia 15 minutos mais cedo?”, tenho certeza que o médico negaria na hora. Ele saberia que chegaria ao resultado final mais rápido, mas a chance de um problema é tão grande, que simplesmente não valeria a pena." Mauricio Aniche (Author) sobre TDD.&#x20;

![Acho que esse gato programa melhor do que nós sem TDD](https://1741304456-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-McAbPJKG_3QKVUBUvUI%2F-McneCXzK5sQ1TAJASHE%2F-McneZxhjXaPddKdQZxZ%2Fcrazy%20cat.gif?alt=media\&token=00482826-14ae-43f7-be20-e1834db3c7d9)

{% embed url="<https://www.youtube.com/watch?t=2s&v=KiJV5S_rMYo>" %}

Olá a todos, enquanto gravava o curso, percebi que precisava revisar, ou mesmo estudar, algumas funcionalidades do Jest. Aproveitei para criar essa seção adicional! 😘 De forma alguma pretendo se exaustivo! Espero que isso ajude pessoas que além do Mongoose, também estejam entrando no mundo do TDD, testes de unidades com Jest.&#x20;

{% hint style="info" %}
Este tutorial é fortemente baseado em "[Jest Crash Course - Unit Testing in JavaScript](https://www.youtube.com/watch?v=7r4xVDI2vho)"
{% endhint %}

{% hint style="info" %}
[Documentação oficial](https://jestjs.io/docs/getting-started) do Jest.&#x20;
{% endhint %}

{% hint style="info" %}
Uma alternativa para o Jest é o [Mocha](https://mochajs.org/). &#x20;

Sugestão de leitura: Fernando Doglio. REST API Development with Node.js: Manage and Understand the Full Capabilities of Successful REST Development.
{% endhint %}

Vamos começar criando nosso aquivo `package.json`.&#x20;

```bash
npm init -y
```

Esse comando vai criar um `package.json` com as configurações padrões.&#x20;

{% hint style="info" %}
Um problema que demorei a entender o porquê no início foi a necessidade de `package.json`, sem ele, dá erros, e os erros não são informativos o suficiente para entender, nem mesmo para jogar no Google.&#x20;
{% endhint %}

Você vai precisar, caso ainda não tenha instalado, o Jest, instalado como Dev

```bash
npm i -D jest
```

### Testando um função que soma

```javascript
//functions.js
const functions = {
    add: (a, b) => a + b
}

```

Para testar:

```bash
//functions.test.js
const functions = require("./functions");

test("Vamos testar uma função que soma", () => {
    expect(functions.add(2, 2)).toBe(4);
})

```

![Resultado do teste da função que soma](https://1741304456-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-McAbPJKG_3QKVUBUvUI%2F-McdCiDbT6H_Z3Sers0i%2F-MceQ5hplbOsuZpsacrL%2Fteste.png?alt=media\&token=5cf48592-434a-421b-876c-e305f4b93398)

Testando o que NÃO é:

```javascript
test("Vamos testar uma função que soma: o que não é", () => {
    expect(functions.add(2, 2)).not.toBe(5);
})

```

{% hint style="info" %}
Estou apresentado, para efeito de estudo, alguns casos. Não vamos usar todos os esses, ou mesmo podemos usar casos diferentes. 😎 Não deixe de consultar a documentação oficial caso esteja adaptando esses exemplos para o seu caso.&#x20;
{% endhint %}

#### Testando para valores "falsy"

```javascript
// toBeNull
test('Deve ser  null', () => {
    expect(functions.isNull()).toBeNull();
});


```

```javascript
// toBeFalsy
test('Deve ser falsy', () => {
    expect(functions.verificador(null)).toBeFalsy();
});

```

#### Testando objetos

```javascript
// toEqual
test('Usuário retornado deve ser Jorge Pires em forma de JSON', () => {
    expect(functions.CriarUsuario()).toEqual({
        firstName: 'Jorge',
        lastName: 'Pires'
    });
});

```

{% hint style="info" %}
Estamos usando  `toEqual` no lugar de `toBe`. Algumas pista por que???
{% endhint %}

#### Menor do que

```javascript
// Menor do que
test('Deve ser menor do que', () => {
    const load1 = 800;
    const load2 = 800;
    expect(load1 + load2).toBeLessThanOrEqual(1600);
});

```

#### Expressões regulares (*Regex*)

```javascript
// Regex, pode ser útil para testar id do mongoose caso modifique o id
test('Não existe s em Jorge', () => {
    expect('Jorge').not.toMatch(/I/s);
});

```

#### Testando conteúdo de um arra&#x79;*/JSON*

```javascript
// JSON
test('Testando para admins', () => {
    usernames = { name1: 'Pedro', name2: 'Pedrosa', name3: 'admin' };
    expect(usernames).toMatchObject({ name3: 'admin' });
});

// Arrays
test('Testando para admins', () => {
    usernames = ['john', 'karen', 'admin'];
    expect(usernames).toContain('admin');
});


```

{% hint style="info" %}
Códigos prontos [aqui](https://github.com/JorgeGuerraPires/curso-mongoose/tree/module_jest_1).
{% endhint %}
