# Unit-Test Synchrone

## Ajout d'un Test

Pour ajouter un test, il suffit de créer un fichier avec l'extension `.spec.ts` dans le dossier `src`. Plus exactement, **la convention est de créer ce fichier dans le même dossier que le fichier contenant le code source à tester**.

Il suffit d'utiliser les 3 fonctions suivantes pour implémenter un premier test :

* `describe` : pour définir une suite *(ou groupe)* de "specs".
* `it` : pour définir une "spec" *(ou un test)*.
* `expect` : pour implémenter les assertions.

{% tabs %}
{% tab title="calculator.spec.ts" %}

```typescript
import { Calculator } from './calculator';

describe('Calculator', () => {

    it('should evaluate 2 + 3 + 4 to 9', () => {

        const calculator = new Calculator();

        expect(calculator.evaluate('2 + 3 + 4')).toEqual(9);

    });

});
```

{% endtab %}
{% endtabs %}

![Output Console](https://4009647861-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-L9vDDYxu6nH7FVBtFFS%2F-LDLt8TuXOItAz73lFC6%2F-LDM38SuY48b5Bj0XFIr%2Fkarma-output-console.png?alt=media\&token=a8a43038-22e9-44b5-9bdb-b90d053bc9bf)

![Output HTML](https://4009647861-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-L9vDDYxu6nH7FVBtFFS%2F-LDLt8TuXOItAz73lFC6%2F-LDM359Tvb5m7EpwYi7B%2Fkarma-output-html.png?alt=media\&token=fc07a9ce-f0e1-4a7b-b78c-c1b4f2bbb29e)

## `beforeEach` & `afterEach`

Comme dans tous les frameworks de tests unitaires, on peut définir des logique de "**setup**" et de "**tear down**" avec respectivement les fonctions `beforeEach` et `afterEach`.

* **`beforeEach`** : permet d'inscrire une fonction de "setup" qui sera appelée avant chaque "spec". Les fonctions de "setup" permettent de **préparer un environnement sain** pour chaque "spec".&#x20;
* **`afterEach`** : permet d'inscrire une fonction de "tear down" qui sera appelée après chaque "spec". Les fonctions de "tear down" permettent de **nettoyer l'environnement** ou encore **exécuter des assertions** pour s'assurer que les "tests" n'ont pas d'effets de bord *(requête HTTP "mocked" non exécutées ou sans réponse)*.

A titre d'exemple, nous pouvons utiliser `beforeEach` afin de **factoriser l'instanciation** de la classe `Calculator` et surtout d'avoir **une nouvelle instance pour chaque "spec"**.

{% tabs %}
{% tab title="calculator.spec.ts" %}

```typescript
import { Calculator } from './calculator';
​
describe('Calculator', () => {

    let calculator: Calculator;

    beforeEach(() => {
        calculator = new Calculator();
    });
​
    it('should evaluate 2 + 3 + 4 to 9', () => {
        expect(calculator.evaluate('2 + 3 + 4')).toEqual(9);​
    });
​
});
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
Les fonctions `beforeEach` et `afterEach` peuvent être appelées plus d'une fois afin de définir **plusieurs fonctions de "setup" et de "tear down"**.\
Ces fonctions seront **appelées dans l'ordre** de déclaration.
{% endhint %}
