Maison >interface Web >js tutoriel >Se moquer des constantes dans les tests avec Jest : un exemple pratique
Lorsque vous travaillez avec des constantes dans vos projets, il est parfois nécessaire de modifier leurs valeurs pour tester différents scénarios. Cependant, les constantes directement importées ne peuvent pas être facilement écrasées, ce qui peut rendre la création de tests difficile. Dans cet article, nous verrons comment utiliser Jest pour simuler dynamiquement des constantes, garantissant ainsi des tests isolés et fiables.
Créons un exemple fictif appelé ajusterImageQuality, où nous ajustons la qualité d'une image selon que nous sommes ou non dans un environnement de production.
On définit une constante appelée IS_PRODUCTION qui indique si l'on est dans un environnement de production :
// constants.js export const IS_PRODUCTION = false;
Maintenant, nous créons la fonction ajusterImageQuality. Cela modifie la qualité de l'image uniquement si le système est en production :
// adjustImageQuality.js import { IS_PRODUCTION } from "./constants"; export default function adjustImageQuality(img) { if (IS_PRODUCTION) { img.quality = 100; // Qualidade máxima em produção } else { img.quality = 50; // Qualidade reduzida em desenvolvimento } return img; }
Nous souhaitons tester le comportement d'ajustImageQuality pour les deux scénarios : production (IS_PRODUCTION = true) et développement (IS_PRODUCTION = false).
Nous utilisons Jest pour nous moquer dynamiquement de la valeur de IS_PRODUCTION. Le secret est d'utiliser jest.mock et de remplacer la constante avec un getter personnalisé.
// adjustImageQuality.test.js import adjustImageQuality from "./adjustImageQuality"; // Mock para a constante IS_PRODUCTION const mockIsProduction = jest.fn(); jest.mock("./constants", () => { const constants = jest.requireActual("./constants"); return { ...constants, get IS_PRODUCTION() { return mockIsProduction(); }, }; }); beforeEach(() => { mockIsProduction.mockClear(); // Limpa os mocks antes de cada teste }); test("sets image quality to 100 in production", () => { // Configura o mock para retornar true (produção) mockIsProduction.mockReturnValue(true); const img = { quality: 0 }; const result = adjustImageQuality(img); expect(result.quality).toEqual(100); }); test("sets image quality to 50 in development", () => { // Configura o mock para retornar false (desenvolvimento) mockIsProduction.mockReturnValue(false); const img = { quality: 0 }; const result = adjustImageQuality(img); expect(result.quality).toEqual(50); });
Nous utilisons jest.mock pour intercepter le module de constantes. À l'intérieur, nous utilisons jest.requireActual pour obtenir les exportations réelles et ajoutons un getter pour la constante IS_PRODUCTION.
jest.mock("./constants", () => { const constants = jest.requireActual("./constants"); return { ...constants, get IS_PRODUCTION() { return mockIsProduction(); }, }; });
Dans chaque test, nous utilisons mockReturnValue pour simuler différentes valeurs pour IS_PRODUCTION :
Avant chaque test, nous effaçons l'état fictif pour nous assurer qu'il n'interfère pas avec d'autres tests :
beforeEach(() => { mockIsProduction.mockClear(); });
Ce modèle simulé pour les constantes vous permet de contrôler dynamiquement les valeurs utilisées dans la logique de votre application, garantissant ainsi des tests isolés et fiables. Ceci est particulièrement utile lorsque vous devez tester des comportements basés sur des variables globales, des configurations ou des états du système.
Avec cette approche, vous pouvez couvrir des scénarios complexes sans compromettre la structure de votre code ni ajouter de dépendances externes inutiles.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!