删除Jest中的原始行记录

u0njafvf  于 2022-12-08  发布在  Jest
关注(0)|答案(5)|浏览(171)

Jest有这个特性来记录输出到console方法的行。
在某些情况下,这可能会变得很烦人:

console.log _modules/log.js:37
  ℹ login.0 screenshot start

  console.time _modules/init.js:409
  login.0.screenshot: 0.33ms

  console.time _modules/init.js:394
  0 | login.0: 0.524ms

  console.log _modules/log.js:37
  ℹ login.1 screenshot start

你知道我怎么才能关掉它吗?

klsxnrf1

klsxnrf11#

对于Jest 24.3.0或更高版本,您可以通过将以下内容添加到在setupFilesAfterEnv中配置的Jest安装文件中,在纯TypeScript中完成此操作:

import { CustomConsole, LogType, LogMessage } from '@jest/console';

function simpleFormatter(type: LogType, message: LogMessage): string {
    const TITLE_INDENT = '    ';
    const CONSOLE_INDENT = TITLE_INDENT + '  ';

    return message
        .split(/\n/)
        .map(line => CONSOLE_INDENT + line)
        .join('\n');
}

global.console = new CustomConsole(process.stdout, process.stderr, simpleFormatter);
3bygqnnd

3bygqnnd2#

Jest将基于可扩展的Console类的自定义控制台实现注入到测试全局范围中。通常,它提供有用的调试信息以及打印的消息,回答可能不需要的输出来自哪里的问题。
如果出于某种原因不希望这样做,则检索默认console实现的一个简单方法是从Node内置模块导入它。
可对特定控制台调用执行以下操作:

let console = require('console');    
...
console.log(...)

对于在一系列测试中发生的许多问题:

const jestConsole = console;

beforeEach(() => {
  global.console = require('console');
});

afterEach(() => {
  global.console = jestConsole;
});

如此等等。

f87krz0w

f87krz0w3#

**更新:**有关Jest的更新版本,请参阅Harald Wellmann的答案。

看看source code的笑话,似乎没有一个整洁的方法来关闭这些消息。
然而,一个可能的解决方案是编写自己的控制台。这里我使用了Jest的Console.js作为起点,然后创建了SimpleConsole,它可以满足您的需要(为了简单起见,我删除了一些终端着色特性,但您可以自己添加它们)。
一旦添加到您的项目中,您就可以在运行测试之前用您自己的控制台覆盖Jest的普通控制台:

const { SimpleConsole } = require('./SimpleConsole');
global.console = new SimpleConsole(process.stdout, process.stderr);

我已经制作了一个REPL来显示它的运行情况。
SimpleConsole的源代码:

const path = require('path');
const assert = require('assert');
const {format} = require('util');
const {Console} = require('console');

function simpleFormatter() {
  const TITLE_INDENT = '    ';
  const CONSOLE_INDENT = TITLE_INDENT + '  ';

  return (type, message) => {
    message = message
      .split(/\n/)
      .map(line => CONSOLE_INDENT + line)
      .join('\n');

    return (
      message +
      '\n'
    );
  };
};

class SimpleConsole extends Console {
  constructor(stdout, stderr, formatBuffer) {
    super(stdout, stderr);
    this._formatBuffer = formatBuffer || simpleFormatter();
    this._counters = {};
    this._timers = {};
    this._groupDepth = 0;
  }

  _logToParentConsole(message) {
    super.log(message);
  }

  _log(type, message) {
    if (process.stdout.isTTY) {
      this._stdout.write('\x1b[999D\x1b[K');
    }
    this._logToParentConsole(
      this._formatBuffer(type, '  '.repeat(this._groupDepth) + message),
    );
  }

  assert(...args) {
    try {
      assert(...args);
    } catch (error) {
      this._log('assert', error.toString());
    }
  }

  count(label = 'default') {
    if (!this._counters[label]) {
      this._counters[label] = 0;
    }

    this._log('count', format(`${label}: ${++this._counters[label]}`));
  }

  countReset(label = 'default') {
    this._counters[label] = 0;
  }

  debug(...args) {
    this._log('debug', format(...args));
  }

  dir(...args) {
    this._log('dir', format(...args));
  }

  dirxml(...args) {
    this._log('dirxml', format(...args));
  }

  error(...args) {
    this._log('error', format(...args));
  }

  group(...args) {
    this._groupDepth++;

    if (args.length > 0) {
      this._log('group', chalk.bold(format(...args)));
    }
  }

  groupCollapsed(...args) {
    this._groupDepth++;

    if (args.length > 0) {
      this._log('groupCollapsed', chalk.bold(format(...args)));
    }
  }

  groupEnd() {
    if (this._groupDepth > 0) {
      this._groupDepth--;
    }
  }

  info(...args) {
    this._log('info', format(...args));
  }

  log(...args) {
    this._log('log', format(...args));
  }

  time(label = 'default') {
    if (this._timers[label]) {
      return;
    }

    this._timers[label] = new Date();
  }

  timeEnd(label = 'default') {
    const startTime = this._timers[label];

    if (startTime) {
      const endTime = new Date();
      const time = endTime - startTime;
      this._log('time', format(`${label}: ${time}ms`));
      delete this._timers[label];
    }
  }

  warn(...args) {
    this._log('warn', format(...args));
  }

  getBuffer() {
    return null;
  }
}

module.exports.SimpleConsole = SimpleConsole;
q1qsirdb

q1qsirdb4#

以上选项都不适合我。

(当前)最简单的解决方案是:

1:使用此代码创建文件(例如config.js)

import console from "console"
global.console = console

2:将此行添加到jest.config.js中

setupFilesAfterEnv: ["./config.js"]
之前:

之后:

祝你愉快!

dldeef67

dldeef675#

如果你想使用Haral Wellmann的答案,但又不想使用 typescript ,那么你可以简单地这样做:

const JestConsole = require('./node_modules/@jest/console');
global.console = new JestConsole.CustomConsole(process.stdout, process.stderr, (type, message) => {
    const TITLE_INDENT = '    ';
    const CONSOLE_INDENT = TITLE_INDENT + '  ';
    return message.split(/\n/).map(line => CONSOLE_INDENT + line).join('\n');
  });

相关问题