ホームページ > ウェブフロントエンド > jsチュートリアル > テスト中にログを一時的に沈黙させる方法

テスト中にログを一時的に沈黙させる方法

Linda Hamilton
リリース: 2024-11-30 10:54:10
オリジナル
277 人が閲覧しました

Changesets ソース コードの Logger パッケージには、テストでのログ メッセージのサイレンシングに関するドキュメントが含まれています。このことから、チェンジセットがどのように動作するのか疑問に思い、そのソース コードを調べてみました。

変更セット リポジトリでサイレンシング ログを検索

Github 検索を使用して、Changesets リポジトリ全体で一時的に SilenceLogs を検索しました。

How to temporarily silence logs in tests

私が一時的に SilenceLogs を検索することにしたのは、それがロガーに記載されているという事実です

パッケージの Readme。

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");
ログイン後にコピー

ソース コードを理解しようとする場合、変更セットのような大規模なプロジェクトを扱う場合は、ドキュメントを出発点として使用し、変数や関数を検索して探索の方向性を設定できます。

一時的にSilenceLogs

以下のコードは、Changesets のソース コードから抜粋されたものです。

How to temporarily silence logs in tests

この関数は引数として関数を受け取り、createLogSilencer という名前の関数を使用してログを沈黙させます。

ここでのセットアップ関数に注目してください:

const dispose = silencer.setup();
try {
 await testFn();
} finally {
 dispose();
}
ログイン後にコピー

ログサイレンサーの作成

以下のコードは変更セットから選択されたものです

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;
      };
    },
  };
};
ログイン後にコピー

ここで何が起こっているのですか?

  1. 課題
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.セットアップを返します

上記でお気づきかと思いますが、setup は一時的に SilenceLogs 内で呼び出され、これは 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;
      };
    },
  };
ログイン後にコピー

セットアップ関数で何が起こっていますか?

2.1 ロガーとコンソール API は 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();
ログイン後にコピー

ロガーを使用するときに jest.fn() が呼び出されるので、これによりログがほぼ沈黙します。したがって、これはセットアップとみなされ、ログを沈黙させるための重要なステップです。

2.2 セットアップは元のロガーを返します

お気づきかと思いますが、関数呼び出しのシーケンスは次のとおりです

a. const Silencer = createLogSilencer();

b. const destroy = Silencer.setup();

c. Final ブロッ​​ク内。

try {
 await testFn();
} finally {
 dispose();
}
ログイン後にコピー

dispose は、createLogSilencer によって返される setup 関数によって返されます。このステップでは、テスト関数の実行後にログ記録メカニズムを復元します。

私たちについて:

Thinkthroo では、大規模なオープンソース プロジェクトを研究し、アーキテクチャ ガイドを提供しています。私たちは、tailwind で構築された、プロジェクトで使用できる再利用可能なコンポーネントを開発しました。 Next.js、React、Node 開発サービスを提供します。

プロジェクトについて話し合うためのミーティングを予約してください。

How to temporarily silence logs in tests

参考文献:

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

  2. https://github.com/search?q=repo:changesets/changesets 一時的にSilenceLogs &type=code

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

以上がテスト中にログを一時的に沈黙させる方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート