{"id":1623,"date":"2020-08-25T12:02:16","date_gmt":"2020-08-25T10:02:16","guid":{"rendered":"http:\/\/blogperso.union31.fr\/?p=1623"},"modified":"2020-08-28T18:11:43","modified_gmt":"2020-08-28T16:11:43","slug":"node-js-autres-modules-externes","status":"publish","type":"post","link":"https:\/\/blogperso.union31.fr\/?p=1623","title":{"rendered":"Node.js : Autres modules externes"},"content":{"rendered":"\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Sommaire<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/blogperso.union31.fr\/?p=1623\/#I_Module_JSDOC_generateur_de_documentation\" >I. Module JSDOC : g\u00e9n\u00e9rateur de documentation<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/blogperso.union31.fr\/?p=1623\/#II_Modules_%C2%AB_Assert_%C2%BB_et_%C2%AB_Mocha_%C2%BB_tests_unitaires_et_qualite_logicielle\" >II Modules \u00ab\u00a0Assert\u00a0\u00bb et \u00ab\u00a0Mocha\u00a0\u00bb : tests unitaires et qualit\u00e9 logicielle<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"I_Module_JSDOC_generateur_de_documentation\"><\/span>I. Module JSDOC : g\u00e9n\u00e9rateur de documentation<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Utile pour g\u00e9n\u00e9rer automatiquement la doc de son application.<\/p>\n\n\n\n<p><span style=\"text-decoration: underline;\">Liens : <\/span><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>lien officiel : <a rel=\"noreferrer noopener\" href=\"https:\/\/jsdoc.app\/\" target=\"_blank\">https:\/\/jsdoc.app\/<\/a> ;<\/li><li>tuto rapide : <a rel=\"noreferrer noopener\" href=\"https:\/\/www.valentinog.com\/blog\/jsdoc\/\" target=\"_blank\">https:\/\/www.valentinog.com\/blog\/jsdoc\/<\/a> ;<\/li><li><strong>pluggin \u00ab\u00a0sublimetext\u00a0\u00bb<\/strong> qui prend en charge l&rsquo;annotation de commentaires : <a rel=\"noreferrer noopener\" href=\"http:\/\/20tauri.free.fr\/DoxyDoxygen\/\" target=\"_blank\">http:\/\/20tauri.free.fr\/DoxyDoxygen\/<\/a> ;<ul><li>g\u00e9n\u00e8re automatiquement les param\u00e8tres&#8230;<\/li><\/ul><\/li><\/ul>\n\n\n\n<p>A installer avec l&rsquo;option dev sous npm :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npm install jsdoc --save-dev<\/code><\/pre>\n\n\n\n<p>A int\u00e9grer dans les scripts de npm pour g\u00e9n\u00e9rer plus simplement la doc &#8230; : voir partie \u00ab\u00a0Script\u00a0\u00bb <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"name\": \"test7_msql2\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified...\\\" &amp;&amp; exit 1\",\n    \"doc\" : \"node_modules\/.bin\/jsdoc . README.md\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"body-parser\": \"^1.19.0\",\n    \"ejs\": \"^3.1.5\",\n    \"express\": \"^4.17.1\",\n    \"mongodb\": \"^3.6.0\",\n    \"mysql2\": \"^2.1.0\",\n    \"path\": \"^0.12.7\"\n  },\n  \"devDependencies\": {\n    \"jsdoc\": \"^3.6.5\"\n  }\n}<\/code><\/pre>\n\n\n\n<p>Commande NPM pour g\u00e9n\u00e9rer la doc :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npm run-script doc<\/code><\/pre>\n\n\n\n<p>Exemple de sortie dans le r\u00e9pertoire &lsquo;out&rsquo; local :<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"340\" src=\"http:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/jsdoc-1024x340.png\" alt=\"\" class=\"wp-image-1629\" srcset=\"https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/jsdoc-1024x340.png 1024w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/jsdoc-300x100.png 300w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/jsdoc-768x255.png 768w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/jsdoc.png 1510w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Pages HTML g\u00e9n\u00e9r\u00e9es avec JSDoc<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"II_Modules_%C2%AB_Assert_%C2%BB_et_%C2%AB_Mocha_%C2%BB_tests_unitaires_et_qualite_logicielle\"><\/span>II Modules \u00ab\u00a0Assert\u00a0\u00bb et \u00ab\u00a0Mocha\u00a0\u00bb : tests unitaires et qualit\u00e9 logicielle<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Le module Assert permet de faire des tests unitaires. Le module MOCHA permet quant \u00e0 lui d&rsquo;organiser et de d\u00e9finir une logique de tests. C&rsquo;est ce dernier module qui va permettre d&rsquo;obtenir des s\u00e9ries de tests lisibles et pratiques pour la qualit\u00e9 logicielle.<\/p>\n\n\n\n<p><span style=\"text-decoration: underline;\">Liens utiles : <\/span><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>doc officielles :<ul><li>module ASSERT de node.js : <a rel=\"noreferrer noopener\" href=\"https:\/\/nodejs.org\/api\/assert.html\" target=\"_blank\">https:\/\/nodejs.org\/api\/assert.html<\/a><\/li><li>module MOCHA : <a href=\"https:\/\/mochajs.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/mochajs.org\/<\/a><\/li><\/ul><\/li><li>tutos :<ul><li><a rel=\"noreferrer noopener\" href=\"https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-test-a-node-js-module-with-mocha-and-assert-fr\" target=\"_blank\">https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-test-a-node-js-module-with-mocha-and-assert-fr<\/a><\/li><\/ul><\/li><\/ul>\n\n\n\n<p>Exemple d&rsquo;un fichier de test :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const gpeec  = require('.\/index_mocha_classe');\nconst assert = require('assert').strict;\n\ndescribe(\"Test int\u00e9gration classes\", function() {\n\n\t\/\/ Cr\u00e9ation d'une personne\n\tlet une_personne     = new gpeec.Personne()\n\t\/\/ Cr\u00e9ation de comp\u00e9tences\n\tlet une_competence   = new gpeec.Competence(1,\"test de libelle\",\"test comment\",0)\n\tlet une_competence2   = new gpeec.Competence(2,\"test2\",\"test comment2,0\")\n\n\n    it(\"V\u00e9rification ajout 2 comp\u00e9tences pour une personne\", function() {\n\t\tune_personne.ajouter_competence(une_competence2)\n\t\tune_personne.ajouter_competence(une_competence)\n\t\t\/\/ V\u00e9rif nombre de competence au total\n\t\tassert.strictEqual(une_personne.get_nb_competence(), 2);\n    });\n\n    it(\"V\u00e9rification suppression d'une competence (nb et libelle restant)\", ()=> {\n\t\tlet nb_competence_avant = une_personne.get_nb_competence()\n\t\t\/\/ suppression de la competence 2\n\t\tune_personne.enlever_competence(une_competence2)\n\t\tlet nb_competence_apres = une_personne.get_nb_competence()\n\t\t\/\/ V\u00e9rif nombre restant\n\t\tassert.strictEqual(nb_competence_avant,nb_competence_apres+1 )\n\t\t\/\/ V\u00e9rif le libell\u00e9 de la competence restante\n\t\tassert.strictEqual(une_competence.libelle, une_personne.liste_competence&#91;0].libelle)\n\n    })\n});\n<\/code><\/pre>\n\n\n\n<p>Avec les classes suivantes (index_mocha_classe) :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n\nclass Competence {\n\tid = 0\n\tlibelle = \"\"\n\tcommentaire = \"\"\n\ttype = 0\n\n\tconstructor(id,libelle,commentaire,type) {\n\t\tthis.id = id;\n\t\tthis.libelle = libelle\n\t\tthis.commentaire = commentaire\n\t\tthis.type = type\n\t}\n}\n\n\nclass Personne {\n\n\tconstructor () {\n\t\tthis.liste_competence = &#91;]\n\t}\n\n\tajouter_competence(une_competence) {\n\t\tthis.liste_competence.push(une_competence)\n\t}\n\n\tenlever_competence(une_competence) {\n\t\tlet index = 0;\n\t\tthis.liste_competence.forEach( competence_encours=> {\n\t\t\tif (competence_encours.id === une_competence.id) {\n\t\t\t\tthis.liste_competence.splice(index,1)\n\t\t\t} \n\t\t\tindex ++\n\t\t})\n\t}\n\n\tget_nb_competence () {\n\t\treturn this.liste_competence.length\n\t}\n\n\t\n}\n\nmodule.exports.Personne = Personne\nmodule.exports.Competence = Competence<\/code><\/pre>\n\n\n\n<p>Ce qui donne le r\u00e9sultat suivant :<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/nodejs_mocha.png\" alt=\"\" class=\"wp-image-1637\" width=\"567\" height=\"213\" srcset=\"https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/nodejs_mocha.png 726w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/nodejs_mocha-300x113.png 300w\" sizes=\"auto, (max-width: 567px) 100vw, 567px\" \/><figcaption>Exemple de sortie Mocha apr\u00e8s lancement des tests<\/figcaption><\/figure>\n\n\n\n<p>A noter :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>une mani\u00e8re de faire l\u00e9g\u00e8rement diff\u00e9rente pour du code asynchrone ;<ul><li>utilisation de la fonction done(err) pour indiquer \u00e0 Mocha quand le traitement est termin\u00e9 ;<\/li><\/ul><\/li><li>idem pour les promesses : voir dans la doc pour le d\u00e9tail ;<\/li><li>pour les asserts, retenir les m\u00e9thodes principales suivantes :<ul><li>assert.strictEqual() : v\u00e9rifie une \u00e9galit\u00e9 ;<\/li><li>assert.notStrictEqual() : v\u00e9rifie une in\u00e9galit\u00e9 ;<\/li><li>assert.throws() : v\u00e9rifie une lev\u00e9e d&rsquo;exception ;<\/li><li>assert.deepStrictEqual() : v\u00e9rifie une \u00e9galit\u00e9 d&rsquo;ensemble de donn\u00e9es ;<\/li><li>assert.notDeepStrictEqual() : v\u00e9rifie une in\u00e9galit\u00e9 d&rsquo;un ensemble de donn\u00e9es ;<\/li><li>assert.ok() : force un test valide ;<\/li><li>assert.fail() : force un test invalide.<\/li><\/ul><\/li><\/ul>\n\n\n\n<p>Enfin, ne pas h\u00e9siter \u00e0 int\u00e9grer MOCHA dans le projet NPM local pour le lancement des tests :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"name\": \"test7_msql2\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"node_modules\/.bin\/mocha index_mocha.test.js\",\n    \"doc\": \"node_modules\/.bin\/jsdoc . README.md\"\n  },\n...<\/code><\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I. Module JSDOC : g\u00e9n\u00e9rateur de documentation Utile pour g\u00e9n\u00e9rer automatiquement la doc de son application. Liens : lien officiel : https:\/\/jsdoc.app\/ ; tuto rapide : https:\/\/www.valentinog.com\/blog\/jsdoc\/ ; pluggin \u00ab\u00a0sublimetext\u00a0\u00bb qui prend en charge l&rsquo;annotation de commentaires : http:\/\/20tauri.free.fr\/DoxyDoxygen\/ ;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1623","post","type-post","status-publish","format-standard","hentry","category-non-classe"],"_links":{"self":[{"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/posts\/1623","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1623"}],"version-history":[{"count":18,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/posts\/1623\/revisions"}],"predecessor-version":[{"id":1645,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/posts\/1623\/revisions\/1645"}],"wp:attachment":[{"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1623"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1623"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1623"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}