Maison >interface Web >js tutoriel >Comment faire taire temporairement les journaux dans les tests

Comment faire taire temporairement les journaux dans les tests

Linda Hamilton
Linda Hamiltonoriginal
2024-11-30 10:54:10330parcourir

Le package Logger dans le code source de Changesets fournit une documentation sur la mise au silence des messages de journal dans les tests. Cela m'a amené à me demander comment les Changesets procédaient et m'a fait examiner son code source.

Recherche dans le référentiel Changesets des journaux de désactivation

J'ai recherché temporairement des SilenceLogs dans le référentiel Changesets à l'aide de la recherche Github.

How to temporarily silence logs in tests

Ce qui m'a fait choisir de rechercher temporairement SilenceLogs, c'est le fait qu'il soit mentionné dans le Logger

package Lisez-moi.

import { temporarilySilenceLogs } from "@changesets/test-utils";
import { log } from "@changesets/logger";
temporarilySilenceLogs();
// Now the logs in this test file are not actually logged to std out
log("I am not logged");
// Use console.log to log messages in tests if required
console.log("Yay, I am logged");

Lorsque vous essayez de comprendre le code source, vous pouvez utiliser la documentation comme point de départ et rechercher des variables et des fonctions pour définir la direction de votre exploration lorsque vous traitez de grands projets comme les Changesets.

temporairementSilenceLogs

Le code ci-dessous est extrait du code source des Changesets.

How to temporarily silence logs in tests

Cette fonction accepte une fonction comme argument puis fait taire les journaux à l'aide d'une fonction nommée createLogSilencer.

Faites attention à la fonction de configuration ici :

const dispose = silencer.setup();
try {
 await testFn();
} finally {
 dispose();
}

createLogSilencer

Le code ci-dessous est sélectionné dans les ensembles de modifications

const createLogSilencer = () => {
  const originalLoggerError = logger.error;
  const originalLoggerInfo = logger.info;
  const originalLoggerLog = logger.log;
  const originalLoggerWarn = logger.warn;
  const originalLoggerSuccess = logger.success;

  const originalConsoleError = console.error;
  const originalConsoleInfo = console.info;
  const originalConsoleLog = console.log;
  const originalConsoleWarn = console.warn;

  const originalStdoutWrite = process.stdout.write;
  const originalStderrWrite = process.stderr.write;

  return {
    setup() {
      logger.error = jest.fn();
      logger.info = jest.fn();
      logger.log = jest.fn();
      logger.warn = jest.fn();
      logger.success = jest.fn();

      console.error = jest.fn();
      console.info = jest.fn();
      console.log = jest.fn();
      console.warn = jest.fn();

      process.stdout.write = jest.fn();
      process.stderr.write = jest.fn();

      return () => {
        logger.error = originalLoggerError;
        logger.info = originalLoggerInfo;
        logger.log = originalLoggerLog;
        logger.warn = originalLoggerWarn;
        logger.success = originalLoggerSuccess;

        console.error = originalConsoleError;
        console.info = originalConsoleInfo;
        console.log = originalConsoleLog;
        console.warn = originalConsoleWarn;

        process.stdout.write = originalStdoutWrite;
        process.stderr.write = originalStderrWrite;
      };
    },
  };
};

Que se passe-t-il ici ?

  1. La mission
const originalLoggerError = logger.error;
const originalLoggerInfo = logger.info;
const originalLoggerLog = logger.log;
const originalLoggerWarn = logger.warn;
const originalLoggerSuccess = logger.success;
const originalConsoleError = console.error;
const originalConsoleInfo = console.info;
const originalConsoleLog = console.log;
const originalConsoleWarn = console.warn;
const originalStdoutWrite = process.stdout.write;
const originalStderrWrite = process.stderr.write;

2. Configuration des retours

Si vous avez remarqué ci-dessus, la configuration est appelée dans temporairementSilenceLogs, ceci est renvoyé par createLogSilencer

return {
    setup() {
      logger.error = jest.fn();
      logger.info = jest.fn();
      logger.log = jest.fn();
      logger.warn = jest.fn();
      logger.success = jest.fn();

      console.error = jest.fn();
      console.info = jest.fn();
      console.log = jest.fn();
      console.warn = jest.fn();

      process.stdout.write = jest.fn();
      process.stderr.write = jest.fn();

      return () => {
        logger.error = originalLoggerError;
        logger.info = originalLoggerInfo;
        logger.log = originalLoggerLog;
        logger.warn = originalLoggerWarn;
        logger.success = originalLoggerSuccess;

        console.error = originalConsoleError;
        console.info = originalConsoleInfo;
        console.log = originalConsoleLog;
        console.warn = originalConsoleWarn;

        process.stdout.write = originalStdoutWrite;
        process.stderr.write = originalStderrWrite;
      };
    },
  };

Que se passe-t-il dans la fonction de configuration ?

2.1 Les enregistreurs et l'API de la console sont initialisés à jest.fn()

logger.error = jest.fn();
logger.info = jest.fn();
logger.log = jest.fn();
logger.warn = jest.fn();
logger.success = jest.fn();
console.error = jest.fn();
console.info = jest.fn();
console.log = jest.fn();
console.warn = jest.fn();
process.stdout.write = jest.fn();
process.stderr.write = jest.fn();

Cela fait pratiquement taire les journaux puisque jest.fn() est appelé lorsque vous utilisez un enregistreur, ceci est donc considéré comme une configuration, une étape importante pour faire taire vos journaux.

La configuration 2.2 renvoie les enregistreurs d'origine

Si vous l'avez remarqué, la séquence d'appels de fonction est

a. const silencieux = createLogSilencer();

b. const dispose = silencieux.setup();

c. Dans le bloc final.

try {
 await testFn();
} finally {
 dispose();
}

dispose est renvoyé par la fonction de configuration renvoyée par createLogSilencer. Cette étape restaure le mécanisme de journalisation après l'exécution de votre fonction de test.

À propos de nous :

Chez Thinkthroo, nous étudions les grands projets open source et fournissons des guides architecturaux. Nous avons développé des composants réutilisables, construits avec tailwind, que vous pouvez utiliser dans votre projet. Nous proposons des services de développement Next.js, React et Node.

Prenez rendez-vous avec nous pour discuter de votre projet.

How to temporarily silence logs in tests

Références :

  1. https://github.com/changesets/changesets/tree/main/packages/logger#silencing-messages-in-tests

  2. https://github.com/search?q=repo:changesets/changesets temporairementSilenceLogs &type=code

  3. https://github.com/changesets/changesets/blob/baf56448606e005577dbe2fb1e78ff457dcaaefd/scripts/test-utils/src/index.ts#L16

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn