Karma & Angular: charger des fichiers JSON "étendus"
J'utilise depuis longtemps le plugin "karma-read-json" qui est utile pour mes tests. En effet, cela permet de vérifier que mes services par exemple produise le bon modèle en sortie en se basant sur un appel REST.
Du coup, je me fais un mock JSON de mon appel REST (issue très souvent d'un vrai appel pour être au plus prêt de la réalité) et je construis un fichier JSON qui contient le JSON espéré.
Cela me permet de vérifier la non-régression de mon code mais aussi de fournir des exemples concrets de JSON que l'application va devoir manipuler.
Parfois, dans les modèles que je définie dans mes services, je fais des modèles un peu plus complexe, qui peuvent contenir des valeurs comme "Infinity". Or l'api JSON présent dans nos navigateurs et dans les moteurs EcmaScript ne gère pas ce genre de valeurs, car se base sur la norme définie sur le lien suivant: http://json.org/
Cela est d'autant plus dommage que nous ne pouvons pas mettre par exemple des commentaires dans nos fichiers JSON pour expliquer le pourquoi du fichier, ou le pourquoi d'une propriété, les valeurs possibles (ce que nous avons l'habitude de faire dans des fichiers XML ou properties, pour configurer nos projets par exemple).
Heureusement, j'ai trouvé une librairie que j'utilise dans pas mal de projets qui se nomme JSON5. Elle fonctionne aussi bien dans nos navigateurs que dans NodeJs, et permet en autre:
- Les commentaires
- Les valeurs numériques complexes comme Infinity, NaN
- Des strings sur plusieurs lignes
- L'unicode
- ...
De ce fait, j'ai étendu le plugin Karma ci-dessus afin de pouvoir utiliser les capacités de JSON5 et ainsi me permettre d'avoir des fichiers JSON de tests afin des valeurs complexes et des commentaires (note: ne pas oublier d'importer JSON5 bien sûr):
var readJSON = function (url) { url = readJSON.base + url; var xhr = new XMLHttpRequest(); var json = null; xhr.open('GET', url, false); xhr.onload = function (e) { if (xhr.status === 200) { json = JSON5 !== 'undefined' ? JSON5.parse(xhr.responseText) : JSON.parse(xhr.responseText);
} else { console.error('readJSON', url, xhr.statusText); } }; xhr.onerror = function (e) { console.error('readJSON', url, xhr.statusText); }; xhr.send(null); return json; }; readJSON.base = '/base/';if (exports !== 'undefined') {exports.readJSON = readJSON; }
Commentaires
Enregistrer un commentaire