Console.log 语句在 Jest 中不输出任何内容

Posted

技术标签:

【中文标题】Console.log 语句在 Jest 中不输出任何内容【英文标题】:Console.log statements output nothing at all in Jest 【发布时间】:2018-07-19 15:02:45 【问题描述】:

console.log 语句在 Jest 中不输出任何内容。昨天这对我有用,但突然之间,它今天不起作用。我对我的配置进行了零更改,并且没有安装任何更新。

我没有使用--forceExit 选项。仍然看到这个问题。

【问题讨论】:

【参考方案1】:

如果您还想查看文件并查看输出,您可以像 --watch --verbose false 这样一起运行这两个选项。

只运行一次--verbose false

【讨论】:

请注意,选项的顺序很重要。例如,如果使用 -t,则需要在 -t 之前加上 --verbose false:jest --verbose false -t my-test 这个答案对于 Jest 27 是不正确的。verbose 与测试输出通过/失败结果的方式有关。 silent 用于抑制控制台输出。 jestjs.io/docs/cli#--silent 这个 (--verbose false) 对我不起作用,我仍然看不到 console.log 语句输出【参考方案2】:

Jest 默认禁止控制台日志消息。为了显示控制台日志消息,请在命令行中将静默选项设置为 false

在命令行中设置--silent=false

npm run test -- --silent=false

【讨论】:

【参考方案3】:

根据https://github.com/facebook/jest/issues/2441的评论,

尝试在 package.json 的 jest 选项中设置 verbose: false (或删除它)。

【讨论】:

只是补充一点,如果你的命令行标志中有--verbose,你也需要删除它。我认为这个答案是不正确的,直到我意识到这一点。谢谢。另外,相关评论在这里:github.com/facebook/jest/issues/2441#issuecomment-286248619 删除"verbose": true 并没有为我解决问题,我不得不将其更改为 false "verbose": false,这似乎已经修复了它。谢谢! 在我的情况下,package.json 文件中有一个 --silent 标志,必须删除它才能看到 console.log 消息 这个答案对于 Jest 27 是不正确的。verbose 与测试输出通过/失败结果的方式有关。 silent 用于抑制控制台输出。 jestjs.io/docs/cli#--silent【参考方案4】:

检查package.json 中的命令行标志,看看那里没有--silent

【讨论】:

【参考方案5】:

除了--verbose 选项会导致上述问题之外,请注意--watch 也可能导致此错误。

【讨论】:

【参考方案6】:

还要确保您的 jest 配置没有 silent: true。就我而言,我没有意识到其他人已将其添加到我们的配置中。

我在list of config options 中没有看到它,但在the command line flag is documented here 中看到。

【讨论】:

【参考方案7】:

日志不打印的潜在原因之一是 console.log 已被嘲笑。如下所示

// jest-setup.js
global.console = 
  // eslint-disable-next-line no-undef
  log: jest.fn(), // console.log are ignored in tests
  // log: console.log,

  // Keep native behaviour for other methods, use those to print out things in your own tests, not `console.log`
  error: console.error,
  warn: console.warn,
  info: console.info,
  debug: console.debug,
;
// package.json
  "jest": 
    "preset": "react-native",
    "moduleFileExtensions": [
      "ts",
      "tsx",
      "js",
      "jsx",
      "json",
      "node"
    ],
    "setupFilesAfterEnv": [
      "@testing-library/jest-native/extend-expect",
      "<rootDir>/src/config/jest-setup.js"
    ],
    "testMatch": [
      "<rootDir>/src/**/__tests__/**/*.test.ts,tsx"
    ]
  ,

如果您希望在jest 中禁用console.log,这通常使用

【讨论】:

我在一些项目中见过global.console = log: process.env['JEST_VERBOSE'] ? console.log : jest.fn(), ;。我认为这是控制控制台输出的更好方法。 @liki:我认为这是一个非常好的主意!【参考方案8】:

尝试改用console.debug()

在测试函数中运行console.debug('Message here', yourValueHere),它应该在运行测试脚本时显示在控制台输出中。您可以使用 Ctrl+F 验证它是否有效,并在标准输出中找到 Message here

这可以在控制台中显示输出,虽然它不是关于如何使用console.log 我理解的答案。

我正在运行 @testing-library/jest-domjest-junit 12.0.0 作为 devDependencies。 jest-junit 的最低配置为

  "jest-junit": 
    "usePathForSuiteName": "true"
  ,

package.json。这主要是为了配置覆盖率报告。 jest 是这样配置的:

  "jest": 
    "testMatch": [
      "**/__tests__/**/*.[jt]s?(x)",
      "**/?(*.)+(spec|test).[jt]s?(x)",
      "!**/utilities.ts",
    ],

【讨论】:

【参考方案9】:

在我的情况下,问题是由 [only] 标志引起的: it.only()test.only('some text',()=&gt;)

【讨论】:

您能提供更多信息吗?标志在哪里应用? @Alireza 不是真正的标志,但当你这样做时test.only( ... )。删除唯一的功能。见docs @Alireza 抱歉,忽略了你的问题 @IsaacPak 感谢您的澄清【参考方案10】:

According to the v27 docs silent 是你想要的。 verbose false(默认)阻止 Jest 输出层次结构中每个测试的结果,而silent true(默认)将:

防止测试通过控制台打印消息。

如果您想从 CLI 使用该选项运行 Jest,请使用 npx jest --silent false。刚刚使用console.log 进行了测试,它按预期工作。

【讨论】:

【参考方案11】:

尝试了有关 jest 配置设置的建议,但无济于事。相反,就我而言,问题似乎与不等待异步代码有关:

test("test", async () => 
  console.log("Does output")

  new Promise(resolve => 
    // some expectation depending on async code
    setTimeout(() => resolve(console.log("Does not output")) , 1)
  )
)

相反,等待承诺确实会输出异步日志:

test("test", async () => 
  console.log("Does output")

  await new Promise(resolve => 
    // some expectation depending on async code
    setTimeout(() => resolve(console.log("Does output")) , 1)
  )
)

可能相关的背景: https://github.com/facebook/jest/issues/2441

【讨论】:

【参考方案12】:

这是一个相当古老的问题,但仍然没有公认的答案。但是,没有一个建议的解决方案对我有用(诸如 --silent --verbose 等设置)。主要问题是 Jest 更改了全局 console 对象。因此,最简单的解决方案是不使用全局 console 对象。

而是从控制台模块导入专用日志功能并使用这些功能:

import  error  from "console";

error("This is an error");

就这么简单。

【讨论】:

【参考方案13】:

尝试使用console.info(),它是console.log() 的别名。我尝试了几乎所有上述答案,但仍然 console.log() 无论如何都没有为我工作。因此,使用了完成工作的 console.info()。

【讨论】:

【参考方案14】:

在我的情况下,问题是在需要模块时生成的日志,所以在实际测试用例开始之前。从***import 更改为在测试用例中使用require 解决了问题。

【讨论】:

【参考方案15】:

将我的文件从 index.spec.js 重命名为 index.test.js 对我有用。

【讨论】:

以上是关于Console.log 语句在 Jest 中不输出任何内容的主要内容,如果未能解决你的问题,请参考以下文章

Console.log 在异步函数中不起作用

Jest单元测试

Jest单元测试

如何测试开玩笑的 console.log

console.log.apply 在 IE9 中不起作用

console.log 在角度控制器中不起作用