Skip to content

Latest commit

 

History

History
executable file
·
235 lines (165 loc) · 6.95 KB

Exercices-6.md

File metadata and controls

executable file
·
235 lines (165 loc) · 6.95 KB
			             _   _           _           _  _____       
			            | \ | |         | |         | |/ ____|      
			      ______|  \| | ___   __| | ___     | | (___ ______ 
			     |______| . ` |/ _ \ / _` |/ _ \_   | |\___ \______|
			            | |\  | (_) | (_| |  __/ |__| |____) |      
			            |_| \_|\___/ \__,_|\___|\____/|_____/       

Exercices - 6

Tests unitaires

Les tests unitaires nous permettent de vérifier que chaque partie du programme fonctionne et ainsi éviter une régression.

Mocha

Mocha est un framework de tests, nous allons l'installer en global pour nous permettre de voir facilement nos règles dans le terminal, via :

npm install -g mocha 

Chai

Pour notre projet nous allons tester les fonctions mais aussi l'accès à l'API, pour cela nous allons passer par une bibliothèque d'assertions. Nous allons installer en devDependencies chai et `chai-http via :

npm install chai chai-http --save-dev 

Tests

Nous allons faire un dossier test à la racine de notre site et faire un fichier user.js à l'intérieur.

Nous allons commencer par décrire ce que nous voulons tester :

'use strict';

process.env.NODE_ENV = 'test';

const chai = require('chai');
const chaiHttp = require('chai-http');
const server = require('../bin/www');
const should = chai.should();

chai.use(chaiHttp);

describe('Users', _ => {
    it('should list all users on /users GET');
});

Nous allons devoir faire une petite modification sur notre fichier bin/www en rajoutant à la fin du fichier un exports pour l'utiliser dans chai via :

module.exports = app;

Puis nous allons lancer notre fichier via mocha :

mocha test/

GET

Puis nous allons commencer à écrire ce que nous attendons de notre API :

'use strict';

process.env.NODE_ENV = 'test';

const chai = require('chai');
const chaiHttp = require('chai-http');
const server = require('../bin/www');

chai.use(chaiHttp);

describe('GET /users', _ => {
    it('should list all users on /users GET', done => {
        chai.request(server)
            .get('/users')
            .end(function (err, res) {
                expect(res).to.have.status(200);
                done();
            });
    });
});

Vous devriez avoir un résultat ressemblant à :

  GET /users
GET /users 200 369.424 ms - 903
    ✓ should list all users on /users GET (397ms)


  1 passing (422ms)

POST

'use strict';

const chai = require('chai');
const chaiHttp = require('chai-http');
const server = require('../bin/www');
const should = chai.should();

chai.use(chaiHttp);

describe('GET /users ', _ => {
    it('should list all users on /users GET', done => {
        chai.request(server)
            .get('/users')
            .end(function (err, res) {
                expect(res).to.have.status(200);
                done();
            });
    });
});

describe('POST /users ', _ => {

    it('it should NOT POST a user', done => {
        const user = {};

        chai.request(server)
            .post('/users')
            .send(user)
            .end((err, res) => {
                expect(res).to.have.status(200);
                /*res.body.should.be.a('object');
                 res.body.user.should.have.property('name');
                 res.body.user.should.have.property('firstname');
                 res.body.user.should.have.property('email');
                 res.body.should.have.property('message').eql('User successfully added!');*/
                done();
            });
    });

    it('it should POST a user', done => {
        const user = {
            name: "Bob",
            firstname: "Josh",
            email: "bob.josh@aol.fr"
        };

        chai.request(server)
            .post('/users')
            .send(user)
            .end((err, res) => {
                expect(res).to.have.status(200);
                /*res.body.should.be.a('object');
                res.body.user.should.have.property('name');
                res.body.user.should.have.property('firstname');
                res.body.user.should.have.property('email');
                res.body.should.have.property('message').eql('User successfully added!');*/
                done();
            });
    });
});

La partie en commentaire montre qu'il est possible de récupérer le corps du texte renvoyé (ici un json).

Npm test

pour simplifier nos tests nous allons rajouter une ligne pour les tests dans notre package.json :

 "scripts": {
    "start": "node ./bin/www",
    "test": "mocha test/"
  };

nous pouvons désormais lancer nos tests en faisant

npm test

Si vous souhaitez pousser le test d'API plus loin, vous pouvez regarder du côté de Frisby. Si vous souhaitez tester les différents éléments dans votre navigateur, regardez du côté de CasperJS

Pour plus de détails sur les tests avec Mocha/Chai je vous conseille l'artiche de Scotch.io.

Intégration continue

Il est possible d'avoir des tests à chaque push sur Git grâce à l'intégration continue, plusieurs sites et programmes proposent ces solutions :

TDD (Test Driven Development)

Le TDD est une technique de travail ou l'écriture des tests se fait avec l'écriture du code ; pour plus d'informations, je vous invite à lire ceci : Les tests unitaires.



Liens utiles

NodeJS

Javascript

jQuery