La façon de tester tourne autour de l'idée de la Pyramide des tests, c'est à dire de trouver le bon équilibre enntre la rapiditié d'exécution et de code, mais l'isolation des tests unitaires, et la lenteur d'exécution et de code des tests fonctionnels, qui seront toutefois mieux intégrés et testeront le réel.
Les tests unitaires sont simple et rapide à écrire. C'est idéal pour tester vos fonctions utilitaires.
Les tests d'intégration sont là pour tester que vos composants s'affichent sans error, pour tester les interactions, etc... Aujourd'hui nous utilisons principalement Enzime pour ça, mais la librairie n'est pas sans défaut, surtout pour tester les interactions entre plusieurs components. Peut-être qu'utiliser une autre librairie serait mieux. Plus d'information
Le snapshot testing est une fonctionalité offerte par Jest qui permet de sérialiser une fonction / un composant React, de sauvegarder le résultat dans un fichier, et, par la suite de vérifier si le résultat de la fonction ou du composant a changé. C'est une manière simple et rapide de tester des composants React, mais il est facile d'ajouter des régressions.
Les tests fonctionnels doivent fonctionner sur des vrais navigateurs ou des navigateurs virtuels (via Browserstack ou Puppeteer par exemple). Comme ils sont lent à lancer, ils ne devraient être utilisés que pour tester les chemins critiques de l'application.
En utilisant toMatchSnapshot, au premier lancement, Jest va créer une capture, et la stocker dans un fichier dans le même dossier que votre fichier de test.
Sur les lancements qui suivront, Jest va refaire une capture de votre fonction / composer, et la comparer à la capture stockée dans le fichier.
Si cette capture est la même, le test va passer, sinon, si la fonction / le composant ne retourne pas la même chose, le test va échouer.
Si le changement est voulu, il est possible de mettre à jour la capture avec jest -u. Soyez certain que le changement est un changement réellement voulu et non une régression.
describe('CustomerRow',()=>{
test('CustomerRow renders correctly',()=>{
const customerJson ={
firstname:null,
customerType:'organization',
phone:['+412273579317'],
email:[],
lastname:'AM STRAM GRAM / LE THÉÂTRE',
_id:'1498-1342',
};
const element =<CustomerRow customer={customerJson}/>;
const tree = renderer.create(element).toJSON();
expect(tree).toMatchSnapshot();
});
test('CustomerRow renders correctly with an invalid phone number',()=>{
const customerJson ={
firstname:null,
customerType:'organization',
phone:['+333','+3387','+3337','+3338','+3329'],
email:[],
lastname:'Mairie - Service des Affaires culturelles',
_id:'1498-848',
};
const element =<CustomerRow customer={customerJson}/>;
Quelques exemples des choses que vous pouvez tester avec Enzyme:
Içi, nous testons qu'un composant va appeler une fonction pour récupérer ses données, et, tant que le composant n'a pas ses données, va afficher une barre de chargement.
// A ce moment là, une autre action va être déclenchée et envoyée à Redux
expect(store.getActions()).toEqual([
{ type:FETCH_OFFER_LIST},
{ type:FETCH_OFFER_LIST},
]);
Vous pouvez simuler des actions sur le DOM, et vérifier que le composant va déclencher les bonnes actions. Dans l'exemple suivant, cliquer sur un bouton radio va sélectionner un object, puis, cliquer sur le bouton de validation va déclencer une fonction passée dans les propriétés du composant, qui prendra en paramètre les objects séléctionnés.
describe('ItemSelectorModal',()=>{
it('should call onSelectedItem with an item after selecting it',()=>{
Il est aussi possible de tester les appels asynchyrones effectués dans les propriétés de votre composant, même si les API d'Enzyme et de Jest ne sont pas forcément idéales selon les cas.
importReactfrom'react';
import{ mount }from'enzyme';
importPostMessageFormfrom'./PostMessageForm';
jest.useFakeTimers();
describe('PostMessageForm',()=>{
it('should call the onMessageCreated function on submit',(done)=>{
// Dans l'implémentation de composant, la soumission du formulaire va appeler une fonction dans un setTimeout AVANT d'appeler la propriété onMessageCreated. La façon de gérer ça sera peut-être différente avec un appel AJAX.
Puppeteer est un navigateur Chrome sans interface graphique, que vous pouvez utiliser en ligne de commande ou via un script. Il permet de charger des pages, remplir des formulaires, prendre des captures d'écran, comme si vous étiez dans un navigateur classique.
Quelques examples de ce qu'il est possible de faire avec, mais regardez son API pour plus d'informations.