Installes et utilises Mochajs dans ton projet Symfony avec Composer par Nicolas Bouteillier

On arrête pas de parler de TDD tous les jours … En parler c’est bien mais faut s’y mettre ! Comme dirait Mc Cain:

C’est ceux qui en parle le plus, qui en mange le moins …

Et si on peut même faire du Cobol en TDD, y’a pas de raison qu’on ne puisse pas le faire pour du JS dans un projet Symfony. Ça va être pour les tests unitaires.

Sans rentrer trop dans les détails, j’ai un setup de dév tout prêt et automatisé avec Vagrant et Ansible, lorsque j’ai besoin d’un outil de dév, j’ai deux solutions:

  • j’intègre le setup dans mon script Ansible, j’installe tout dans ma VM
  • j’utilise composer et je mets ce qu’il faut dans les requis pour l’environnement de dév

Je suis plus back que front, je fais du JS, mais ça n’est pas ma grande spécialité, donc pour progresser, je me suis dit (en plus de lire excellent « Javascript et Jquery » de Jon Duckett), je vais faire du TDD !

Et là c’est le drame … Comment faire pour tester proprement du JS dans un projet symfony (PHP) ?

Après quelques recherches je trouves Mochajs, la syntaxe me parle, c’est documenté, et puis faut bien se lancer.

Il faut avoir Nodejs installé, puis Mochajs.

On va utiliser deux packages composer:

Le premier se charge d’installer nodejs, uniquement si il n’est pas déjà installé globalement, et le deuxième permets d’installer des assets avec NPM entre autre.

mouf/nodejs-installer

Packagist: https://packagist.org/packages/mouf/nodejs-installer
Github: https://github.com/thecodingmachine/nodejs-installer

koala-framework/composer-extra-assets

Packagist: https://packagist.org/packages/koala-framework/composer-extra-assets
Github: https://github.com/koala-framework/composer-extra-assets

L’installation à proprement parler:

Dans ton composer.json ajoutes ça:

"require": {
    "mouf/nodejs-installer": "^1.0",
    "koala-framework/composer-extra-assets": "~1.1"
},
"extra": {
    "require-dev-npm": {
        "mocha": "*"
    }
}

Pour pouvoir utiliser mocha localement, il lui faut nodejs dans le $PATH

Dans la section script de ton composer.js tu va ajouter cette ligne dans « post_install_cmd » et « post_update_cmd » pour qu’elle soit exécutée après install ou update:

"touch bin/mocha && chmod +x bin/mocha && echo '#!/bin/bash \n DIR=$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd ) \n export PATH=$DIR/../vendor/nodejs/nodejs//bin:$PATH \n ../node_modules/.bin/mocha \"$@\"' > bin/mocha"

Cette ligne va simplement créer le fichier bin/mocha et ajouter node au $PATH avant d’exécuter le « vrai » mocha.

Exemple de section script de mon composer.json:

],
    "scripts": {
        "post-root-package-install": [
            "SymfonyStandard\\Composer::hookRootPackageInstall"
        ],
        "post-install-cmd": [
            [...] //do not copy/paste, it's just an example !
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::removeSymfonyStandardFiles",
            "touch bin/mocha && chmod +x bin/mocha && echo '#!/bin/bash \n DIR=$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd ) \n export PATH=$DIR/../vendor/nodejs/nodejs//bin:$PATH \n ../node_modules/.bin/mocha \"$@\"' > bin/mocha"
        ],
        "post-update-cmd": [
            [...]  //do not copy/paste, it's just an example !
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::removeSymfonyStandardFiles",
            "touch bin/mocha && chmod +x bin/mocha && echo '#!/bin/bash \n DIR=$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd ) \n export PATH=$DIR/../vendor/nodejs/nodejs//bin:$PATH \n ../node_modules/.bin/mocha \"$@\"' > bin/mocha"
        ]
    },

Pour installer tout ça:

composer install

#ou

compose update

Si composer est installé globalement.

Attention, prends deux minutes et va lire les différences entre composer install et update, pour ne pas faire de bêtises https://stackoverflow.com/questions/33052195/what-are-the-differences-between-composer-update-and-composer-install/33052243#33052243

Création du répertoire des tests

Soit directement dans ton IDE ou en terminal (attention aux permissions), tous les tests iront dans ce répertoire

mkdir src/Tests/Js

Un vrai exemple qui fonctionne:

Crées quelque part (on va dire dans src/js/) un fichier jeTestLeTddEtCestTop.js

function sum(a, b) {
    return a+b;
}
exports._test = {
    sum:sum
};

Puis dans src/Tests/Js

var asset = require('assert');
var app = require("../../../src/js/jeTestLeTddEtCestTop.js");

describe('sum', function () {

it('should return 5', function(){
var sumResult = app._test.sum(2,3);
assert.equal(sumResult, 5);
});

});

Pour lancer les tests

Tous les tests:

bin/mocha src/Tests/Js/*

Un test spécifique:

bin/mocha src/Tests/Js/file.js

C’est tout ! Tu peux faire du TDD pour ton JS.

Je sais que ça ne couvre que les tests unitaires, mais mon principal besoin est de découper et architecturer correctement mon JS, ceci dit, aujourd’hui je vais tester Panther pour faire les tests E2E, ça sera peut être le sujet d’un autre article. Et pour finir je ferai tourner ça de manière automatisée au moment de la mise en préprod de mon code.

Pour conclure, c’est un setup expérimental, je n’ai pas trouvé beaucoup d’infos. Si tu as des pistes, un setup plus performant, d’autres outils, de l’expérience, partages et dis nous tout en commentaire !

Auteur/autrice : Nicolas Bouteillier

Si Nicolas était une liste de tags: développeur, technicien, artisan, entrepreneur, geek. Nicolas est développeur depuis 2002, il a accompagné en mode lean startup plusieurs démarrages de projets, gérant de sa SARL, autoentrepreneur, salarié, c'est un touche à tout riche d'expériences variées qui a accosté sur les rives de l'agilité sans jamais quitter le monde entrepreneurial.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.