删除在Jest中记录原始线

时间:2018-07-27 10:03:35

标签: javascript node.js logging jestjs

Jest具有此功能,可记录输出到 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 方法的行。

在某些情况下,这可能会很烦人:

iframe

有什么主意我可以将其关闭吗?

3 个答案:

答案 0 :(得分:2)

看着source code的Jest,似乎没有一种巧妙的方法可以关闭这些消息。

但是,一种可能的解决方案是编写您自己的控制台。在这里,我以Jest的Console.js为起点,然后创建了SimpleConsole来满足您的需要(为简单起见,我删除了一些终端着色功能,但您可以自己添加它们)。 / p>

一旦添加到项目中,您可以在运行测试之前用自己的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;

答案 1 :(得分:1)

对于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);

答案 2 :(得分:1)

Jest将基于可扩展https://pypi.org/project/yolk/的自定义控制台实现注入测试全局范围。通常,它会在打印的消息旁边提供有用的调试信息,以回答潜在的有害输出来自何处的问题。

如果由于某种原因而不希望这样做,则检索默认console实现的一种简单方法是从Node内置模块中将其导入。

可以为特定的控制台调用完成:

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

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

const jestConsole = console;

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

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

以此类推。