Jest: 运行测试时console.log不输出

创建于 2016-12-25  ·  236评论  ·  资料来源: facebook/jest

您要请求功能还是报告错误

报告错误

目前的行为是什么?

使用jsdom的默认 testEnvironment 调用console.log不会打印到标准输出。

如果当前行为是一个错误,请通过https://repl.it/languages/jest或 GitHub 上的最小存储库提供重现步骤和 repl.it 演示,我们可以yarn installyarn test

  1. 克隆https://github.com/udbhav/jest-test
  2. 运行yarn test
  3. 确认您没有从 console.log 中看到任何内容
  4. testEnvironment Jest 配置设置更改node
  5. 重新运行yarn test
  6. 确认您看到的是来自 console.log 的输出

什么是预期行为?

我希望在我的测试运行时始终输出 console.log。

请提供您确切的 Jest 配置并提及您的 Jest、节点、yarn/npm 版本和操作系统。

有关软件包版本,请参阅 repo 中的package.jsonyarn.lock 。 我正在运行节点 7.3.0 和纱线 0.18.1

最有用的评论

我正在使用节点 v4.4.7,就我而言 - 使用console.log时没有任何显示到标准输出是一个问题。 我不是要寻求编码方面的帮助,而是向我报告似乎是错误的内容。 唯一改变的另一件事是我之前运行了多个测试文件,现在只有一个。 让我看看重新启用其他测试是否会使console.log输出再次出现。

所有236条评论

刚刚使用 repl.it 对此进行了测试: https ://repl.it/EwfT/0

好消息是它按预期工作并且 console.log 输出。 我尝试将我的 jest 版本降级到 17.0.3,但仍然遇到相同的问题。 安装了nvm以使用节点 v6.9.2 进行测试,并且 hurray console.log 与 jsdom 一起使用,所以我假设问题与节点 v7 相关。

感谢您报告此问题,但这是#2166 的重复,并且也发生在节点 6 上。

@thymikee这是#2166 的副本吗? 在这种情况下, console.log根本不输出任何内容。 我在使用 Node v4 时遇到了这个问题。 令人沮丧的是,今天早些时候它运行良好,并且我的环境发生了 0 次更改,我的终端不再有console.log输出。

@thisissami那时您的测试或代码似乎没有运行。 Jest 的测试套件通过节点 4 和节点 6,确保控制台打印正常工作,我们正在为 7.3 进行修复。

@cpojer - 我的测试正确通过/失败 - 只是console.log消息没有显示。 我在尝试通过console.log来找出特定对象的属性时发现了这一点,但没有看到任何输出。 我添加了许多console.log语句,现在我的终端中没有出现。 =/ 我目前正在恢复到Jest v17以查看是否有任何改变。

如果它今天早些时候为您工作并且不再适用,那么您一定是自己进行了更新或破坏了某些东西。 我们没有在两周内发布 Jest 版本。

好的,所以我的测试代码中唯一改变的是我在应该运行的代码之后添加了多行注释(作为我自己的参考)。 我会看看删除它是否会有所不同。

@cpojer我不知道该说什么,我的测试代码中没有发现任何问题,但是没有任何内容输出到标准输出:

import React from 'react';
import {shallow} from 'enzyme';
import FundPercentage from '../../src/reactClasses/fund_percentage';

console.log('cmon');
describe('Normal Percentage', () => {
  console.log('do this');
  const percentage1 = shallow(
    <FundPercentage percentage={0.5}/>
  );
  const percentage2 = shallow(
    <FundPercentage percentage={0.26}/>
  );
  it('should work', () => {
    console.log(percentage1.childAt(0));
    expect(0).toBe(1);
  });
});

测试失败了,正如预期的那样,所以我知道它正在工作。 我在package.json中的配置非常简单,只有:

  "jest": {
    "collectCoverageFrom": [
      "src/*.jsx"
    ]
  }

Jest 完全正常运行,没有附加额外的标志。 与 Jest v17 和 18 相同的问题。

整个下午,除了这个文件之外,我没有更改任何文件。 我刚刚通过将各种内容输出到stdout来了解enzyme工作的,在开始添加一些expectsconsole.logs停止了在我再次需要它们时工作,现在它们根本不起作用 - 无论我在测试中有什么。 我也没有改变我的环境中的任何东西(除了刚刚降级到 v17),这当然令人困惑。

您似乎已更新到节点 7.3。 我们为此做了一些修复。 请注意,此问题跟踪器不是帮助论坛; 使用 stackoverflow 回答问题:)

我正在使用节点 v4.4.7,就我而言 - 使用console.log时没有任何显示到标准输出是一个问题。 我不是要寻求编码方面的帮助,而是向我报告似乎是错误的内容。 唯一改变的另一件事是我之前运行了多个测试文件,现在只有一个。 让我看看重新启用其他测试是否会使console.log输出再次出现。

@cpojer 可以肯定你们这里有一个错误。

运行 3 个测试(如在.test.js 3 个不同文件中,其中 2 个文件是您教程中的示例)可以正常工作。 我的测试(上面复制的)呈现了所有的 console.logs。

仅进行 1 次测试运行(也就是我在其中 2 个文件上将.test.js重命名.teast.js )导致没有呈现 console.log 输出。

我将继续运行第二个任意测试,以便我看到我需要的输出,所以我很好地满足了我自己的个人需求 - 但这应该在 imo 中得到解决,假设它可以在其他地方重现。

Jest 的测试套件在节点 4、节点 6 和节点 7.3 上测试此行为。 它适用于 4 和 6,但在 7.3 中被破坏。 我正在为节点 7.3 修复此问题,并将很快发布 Jest 的新版本: https :

如果 Jest 自己的使用节点 4 的测试套件对您来说失败了,那么您的设置可能有问题。

克隆存储库并立即尝试。

除了这 3 个测试外,一切都通过了。 不确定这可能有什么影响。 你有我遇到的与 console.log 相关的错误的所有信息,以及下面的图片。 如果这不是开玩笑的错误,那就这样吧。 对我来说似乎很奇怪,尽管除了遵循指南什么都不做会导致我在只运行一个测试文件时看不到我的日志的情况。

screen shot 2016-12-28 at 5 55 29 pm

这些只是表明您没有安装 mercurial (hg),与您的问题无关。 好像测试套件通过了你,正如所说的; 我们在测试套件中明确测试日志记录行为,因此您的代码或设置肯定有问题。

好酷 - 感谢您的反馈。 当有多个文件而不是只有 1 个文件时,您是否知道什么可能导致它工作? 如果您没有想到明显的“哦,这有时会导致类似的问题” - 不用担心,我会确保始终至少有 2 个文件在运行。 :)

我遇到了同样的问题,console.log 现在没有为我输出(以前是大约一个小时前)。 我正在使用节点 6.9.1 并启用 --forceExit 标志。 当我没有启用这个标志时,console.log 输出就会出现。

但是,我有另一个使用 --forceExit 标志和 console.log 出现的测试脚本,所以我不能说 --forceExit 标志导致了这种行为。

正如@thisissami所做的那样,只有在我尝试测试单个文件时才会遇到日志记录问题。

我遇到了同样的问题,但发现这是由于在 gulpfile.js 中通过 jest-cli (jest.runCLI) 运行 jest 并且它吞下了 console.log 的输出。 如果我直接运行 jest,我会看到控制台输出。

我现在看到了一些奇怪的行为,我还不能将其隔离到一个简单的测试用例中,否则我会提交一个新问题。

1) Jest 运行测试
2)Jest输出console.log语句(这里不要眨眼)
3) Jest 向上滚动任意数量的行,有时会覆盖所有的 console.log 行,有时是一些,有时是全部。
4) Jest 运行下一个测试(上一个测试中的 console.log 行消失)。

开玩笑 v18.1.0

由于我无法在一个简单的测试中隔离它,我猜它与运行更复杂的异步测试有关。

我遇到了同样的问题,我想知道它的输出是否覆盖了其他输出。 偶尔我会看到这样的事情:

image

这就像一个进程输出了一个错误(失败的道具类型),但它只是被测试输出日志直接写入。

更多的:

image

有时,如果在测试运行时我Ctrl + c ,我会看到控制台日志,如果我让测试完成,我将看不到这些日志。

版本
开玩笑:17.0.1
节点:6.6.0
NPM:3.10.3
macOS:10.12.2
终端:2.7.1(也在 iTerm2 3.0.13 中)
脚本(在package.json ): jest /src/main/js --watchjest /src/main/js --coveragejest --watch --onlyChanged都具有相同的行为。

@davidgilbertson它发生在 v18.1 上吗?

我试过18.1.0 ,它似乎更糟糕。 我仍然看到这样的事情:

image

我不能选择任何特定的模式,但是已经发生了一些事情(我的一个组件中有console.warn('----------------') 。)

  • 如果我在运行测试时从底部向上滚动一点,我会看到日志。 如果我在测试滚动时向下滚动终端窗口(以便它开始自动滚动),那么当测试完成时,我向上滚动并且 console.warn 行消失了(大概被覆盖了)。
  • 如果我运行测试并立即点击ctrl + c ,我会看到一些控制台日志。 但是如果我这样做并且不中断,那些控制台日志是不可见的。
  • 当我运行jest /src/main/js --watch一次,然后点击a再次运行时,它会在src/main/assets/legacy目录中提取大量遗留测试 - 与 glob 不匹配。
  • 如果我只运行jest --watch (我的所有测试都以.test.js.test.jsx结尾),则与上述相同。 因此,在监视模式下按 'a' 似乎到处寻找,包括一个名为src/test/js/spec/categoryselector/spec.js的旧茉莉花测试。 击中Enter似乎符合我的预期。

难道是缺少 props 抛出的所有错误都会导致这个问题? 我必须保留ctrl+c输出以尝试在它们被覆盖之前捕获这些错误。

也不适合我(开玩笑 19.0.1,节点 5.12)。 有趣的是,它确实适用于具有相同设置的另一个项目。 不确定如何调试 Jest 测试,因此我认为能够看到一些控制台消息非常重要。

您是否尝试过使用 jest 标志--runInBand来查看是否通过连续运行测试来解决它? 有人向我提到了这一点,但还没有机会进行测试。

bail标志阻止控制台日志打印。

我会尝试。 稍微令人不安的是,在同一个项目中,有些控制台日志语句正在控制台上输出,有些则没有。 不幸的是,我试图在测试用例失败的地方添加的那些没有得到输出(我试图在测试用例、单元测试等的任何地方添加都无济于事)。 所以我实际上并不认为这可以归结为一个标志,因为行为并不简洁。 这是一个反应原生项目,遵循标准布局顺便说一句。

这些似乎都没有帮助。 --bail 标志只是停止运行其他测试(在我的情况下,有问题的测试是最后一个),并且 --runInBands 似乎没有任何可观察到的差异。 顺便说一句,Jest 确实运行了更新的文件,所以如果我插入一个 console.log 语句,错误堆栈跟踪会显示来自更新行号的错误。 只是控制台日志没有发生。 由于很难/不可能在浏览器中调试这些测试(如果不是这种情况,请纠正我) console.log 对于修复测试中的某些问题绝对至关重要。

似乎这个测试用例实际上并没有运行。 有一个类型错误(访问一个未定义的属性)。 误导我的是我实际上在控制台上看到了堆栈跟踪,这表明它正在执行。 所以看到跟踪但没有看到日志消息并没有完全加起来:) 有谁知道为什么这样做,所以如果测试失败并出现运行时错误,日志不会像看起来那样输出? (为了清楚起见,我的意思是在错误发生之前发生的日志,我显然不是指错误发生后的日志:))

在我的环境中,我在package.json的 jest 选项中设置了verbose: true package.json 。 将此更改为 false(或删除它)为我解决了这个问题。 我所有的控制台日志现在都显示了。

这是在 18.1 中。

对于遇到此问题的任何其他人,请检查最近添加的任何依赖项。 在添加mock-browser以尝试模拟浏览器对象后,我开始遇到问题。 显然,它用自己的对象替换了global

package.json(开玩笑的配置)

"jest": {
    "testEnvironment": "node",
    "moduleFileExtensions": [
        "js",
        "json"
    ],
    "moduleDirectories": [
        "node_modules",
        "src"
    ],
    "transform": {
        "^.+\\.js$": "babel-jest"
    },
    "roots": [
        "<rootDir>/__test__"
    ],
    "setupFiles": [
        "<rootDir>/__test__/test-setup.js"
    ],
    "moduleNameMapper": {
        "client": "<rootDir>/src/client",
        "common": "<rootDir>/src/common",
        "server": "<rootDir>/src/server",
        "!CONFIG": "<rootDir>/config/env/test.js",
        "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/__mocks__/file.js",
        "\\.(css|less)$": "identity-obj-proxy"
    }
}

测试setup.js

const mockBrowser = require('mock-browser').mocks.MockBrowser;

const MockBrowser = new mockBrowser();
global.APP_CONFIG = require('!CONFIG').default;

global.__DEVELOPMENT__ = false;
global.__TESTING__ = true;
global.__PRODUCTION__ = false;
global.document = MockBrowser.createDocument();
global.window = MockBrowser.createWindow();
global.localStorage = MockBrowser.getLocalStorage();

测试setup.js
注释掉mock-browser位...

// const mockBrowser = require('mock-browser').mocks.MockBrowser;

// const MockBrowser = new mockBrowser();
global.APP_CONFIG = require('!CONFIG').default;

global.__DEVELOPMENT__ = false;
global.__TESTING__ = true;
global.__PRODUCTION__ = false;
// global.document = MockBrowser.createDocument();
// global.window = MockBrowser.createWindow();
// global.localStorage = MockBrowser.getLocalStorage();

console.log工作正常。

为什么这个问题被关闭了? 显然不是#2166的重复

我会添加我的 0.02 美元,因为我刚刚遇到了这个问题。

问题:

  • 我正在运行jest --watch --verbose (v19.0.2)
  • 某些(但不是全部!) console.log语句不会出现,无论是在测试运行期间还是在摘要中
  • 就我而言,我可以把它隔离到_.reduce呼叫:所有console.log此块内声明没有显示console.log显示的减少块的语句。 我已经通过其他方式(覆盖率、测试结果)验证了实际上正在调用减速器主体。 这很奇怪,因为在这部分代码中我没有做任何异步/承诺,我无法理解为什么 reduce 调用会影响任何事情。
  • 如果我用--runInBand调用 jest ,我会看到所有console.log语句。
  • 与之前的大多数报告不同,我使用的是"testEnvironment": "node" ,而不是jsdom

以下评论似乎与我的问题有关:

https://github.com/facebook/jest/issues/2441#issuecomment -273643521
https://github.com/facebook/jest/issues/2441#issuecomment -278202180

这是相当快,但似乎像console.logs实际上被绘制到屏幕上,然后覆盖。

刚刚通过视频确认console.log实际上在被绘制之前被绘制到屏幕上约 0.2 秒。

--watch没有--verbose情况下运行--watch --verbose似乎可以解决这个问题。

我花了 10 分钟试图获得一个孤立的复制案例,但我似乎无法做到。 它可能只体现在大型(好吧,>1)测试套件中。

您可以在此处查看行为:

  • 在 console.log 之前
    screen shot 2017-03-29 at 3 38 51 pm

  • console.log - 显示一秒钟(<0.2s)
    screen shot 2017-03-29 at 3 39 34 pm

  • 在 console.log 被涂上之后
    screen shot 2017-03-29 at 3 39 47 pm

这个问题真的很糟糕,在这个问题上浪费了很多时间,但似乎没有任何效果。 我选择 jest 是因为我认为 Facebook 工程师有一个不错的测试套件,现在这个......

这就是我不喜欢Jest的原因。 无论你做什么,他们都会清除你的控制台并拒绝显示任何控制台语句,然后它们会以某种方式随机显示,直到你有一个需要修复的错误,在这种情况下,他们会尽力隐藏每个log 语句,因此您无法修复它。

为什么不停止尝试向开发人员隐藏控制台输出? 如果我想要训练轮,我将使用 Angular 1!

这是相当激进的@halis。 我们这样做是因为 Jest 将测试并行化,并且许多测试可能同时登录到终端,这意味着 Jest 的输出变得无用。 我们实际上曾经这样做过。 如果您使用--verbose ,我们实际上不会缓冲任何内容并直接写入控制台。

如果这对您不起作用,也许您可​​以通过向 Jest 发送 PR 并改善这种行为来帮助我们。

对不起,我星期五过得很糟糕,很沮丧。 没有理由把它放在你身上,你只是想帮忙。

我确实在周五找到了 --verbose 标志,它为我提供了足够的输出来解决我的问题。

再次,很抱歉我对它如此粗鲁。

那太棒了。 不要让 JavaScript 工具毁了你的星期五 😀

有什么消息吗? 如何显示console.log?

非常有趣的行为,在敲打我的头几次(更像是几次)之后,我发现 --verbose 确实是没有打印出 console.log 的罪魁祸首。
我最好的解决方案是在 package.json 中创建另一个脚本,当我想在控制台中打印出一些 msg 时,该脚本不涉及详细标志。 如果你们尽快解决这个问题,我将不胜感激

这个问题确实很烦人,因为它使得使用 console.log 调试测试变得困难/不可能(我知道......老派但仍然方便)。
让我使用--runInBand选项使我的日志语句出现。

编辑:我很确定这与结果在屏幕上的显示方式有关......一种选择是拥有一个不尝试花哨渲染的“虚拟”记者。 另一种选择是让开发人员选择像 mocha 那样的记者。

这比不显示日志更糟糕:

如果我在异步测试中出现任何形式的错误,那么我不仅看不到日志消息,而且还隐藏了expect错误,并吞下了异常。

test('async', (done) => { setTimeout((() => { expect(1).toEqual(2); throw new Error(); done(); }), 1000); });

我的expect测试无处显示。

````
超时 - 在 jasmine.DEFAULT_TIMEOUT_INTERVAL 指定的超时内未调用异步回调。

  at Timeout.callback [as _onTimeout] (../../../../../../../../usr/local/lib/node_modules/jest/node_modules/jsdom/lib/jsdom/browser/Window.js:523:19)
  at ontimeout (timers.js:386:14)
  at tryOnTimeout (timers.js:250:5)
  at Timer.listOnTimeout (timers.js:214:5)

````

runInBandverbose:false帮助。

我有一个非常简单的 ( babel-jest ) 配置。

@richburdon使用done回调进行异步测试,您需要使用done.fail()覆盖失败的情况

@thymikee感谢您的快速回复。 我不知道你的意思。 你能修改我的测试和/或指出我的文档吗? 非常感谢。

test('async', (done) => { setTimeout((() => { expect(1).toEqual(2); throw new Error(); done(); }), 1000); });

test('async', (done) => {
  setTimeout((() => {
    expect(1).toEqual(2);
    try {
      throw new Error();
    } catch (error) {
      done.fail(error);
    }
    done();
  }), 1000);
});

我知道这并不理想,但这就是它目前的工作方式。 值得注意的是,当测试函数返回 Promise时,这不是问题。 此行为会影响几个问题,例如https://github.com/facebook/jest/issues/2136https://github.com/facebook/jest/issues/2059。 如果您有关于如何改进它的想法,我们很乐意审查 PR 并实现它。

但这不是讨论它的相关问题,您可以在其他地方发表您的想法。

@thymikee ,我的例子不是一个好例子,因为setTimeout有与承诺有关的问题,这些问题与开玩笑无关......

值得注意的是,当测试函数返回一个 Promise 时,这不是问题。

我没有看到:

````
测试('异步',(完成)=> {
函数 foo() {
返回 Promise.resolve(1);
}

foo().then(value => {
期望(值).toEqual(2); // 从未报告过; 只是超时。
完毕();
});
});
````

测试代码是否应该捕获expect调用的异常(即测试框架本身的一部分)并不明显。 这看起来很复杂?

所以,为了清楚起见,我应该包装所有测试,这些测试涉及任何返回带有 catch 块的承诺的测试函数——以捕获expect调用,否则将: a) 超时; b) 不报告错误。

除非我犯了一个不同的错误:

一个)。 也许记录这个(https://facebook.github.io/jest/docs/asynchronous.html#content)?

b)。 为什么不记录错误? 和/或可以选择退出?

我对 console.log 有同样的问题。
它在 v19 中运行良好,我能够在控制台中看到输出。
升级到v20.0.3后,输出没了。
我试图添加--runInBand--verbose ,但没有帮助。

请升级到最新版本的nodejs。 这是节点 ~7.3 中的一个已知问题。

@thymikee那么他们会解决这个问题吗? 我已经尝试了阳光下的一切。 仍然没有控制台日志。 我正在使用 typescript 和 jest 提供的预处理器。 我正在使用 ts-jest 并且他们的预处理器工作正常。 它可能与预处理器有关吗?

@cpojer @lsentkiewicz我们应该打开一个新问题,因为它是新版本的新问题吗?

正如@cpojer 所提到的,使用最新版本的节点修复了这个问题。

@marcusjwhelan
在 v7.10.0 上对我有用

使用jest --bail时,我仍然看到控制台输出被吞没。

@cpojer

不适用于节点 8.0.0

如果您必须使用某个版本才能使其工作,我觉得这是一个糟糕的错误。 如果您的系统在 6.0 上运行并且由于某些 nodejs 更改而无法在 7.0 中运行怎么办。 至少在现代版本的 Node 上不应该开玩笑吗? 至少 5 年的支持? @cpojer @taion

这仅是节点 7.3 中的错误。 他们合并了一个不好的更改并将其还原为 7.4 或 7.5。

人们告诉我它在节点 8 上不起作用,但我们对此行为进行了测试并且它正在通过。 如果人们想使用 Jest 20 和节点 8 创建一个适当的重现,那么请为此创建一个问题。

@cpojer我没有看到这个设置(macOS)有任何 console.log 输出:

$ node --version
v7.4.0

文件

package.json

{
  "dependencies": {
    "@types/jest": "19.2.4",
    "jest": "20.0.4",
    "ts-jest": "20.0.6",
    "typescript": "2.3.4"
  }
}

__tests__/jestconfig.json

{
  "rootDir": "../",
  "globals": {
    "__TS_CONFIG__": {}

  },
  "moduleFileExtensions": [
    "ts",
    "tsx",
    "js",
    "jsx",
    "json"
  ],
  "transform": {
    "\\.(ts|tsx)$": "<rootDir>/node_modules/ts-jest/preprocessor.js"
  },
  "testRegex": "__tests__/.*test_.*\\.(ts|tsx|js)$"

__tests__/test_foo.ts

import {} from 'jest';

console.log('CONSOLE before test');
test('fail', () => {
  console.log('CONSOLE inside test');
  expect(true).toEqual(false);
  console.log('CONSOLE end of test');
})

__tests__/test_bar.js

console.log('BAR CONSOLE before test');
test('fail', () => {
  console.log('BAR CONSOLE inside test');
  expect(true).toEqual(false);
  console.log('BAR CONSOLE end of test');
})

输出

$ jest -c __tests__/jestconfig.json 
 FAIL  __tests__/test_foo.ts
  ● fail

    expect(received).toEqual(expected)

    Expected value to equal:
      false
    Received:
      true

      at Object.<anonymous> (__tests__/test_foo.ts:6:16)
      at Promise.resolve.then.el (node_modules/p-map/index.js:42:16)

 FAIL  __tests__/test_bar.js
  ● fail

    expect(received).toEqual(expected)

    Expected value to equal:
      false
    Received:
      true

      at Object.<anonymous>.test (__tests__/test_bar.js:4:16)
      at Promise.resolve.then.el (node_modules/p-map/index.js:42:16)

Test Suites: 2 failed, 2 total
Tests:       2 failed, 2 total
Snapshots:   0 total
Time:        1.379s
Ran all test suites.

单JS测试:

$ jest -c __tests__/jestconfig.json __tests__/test_bar.js 
 FAIL  __tests__/test_bar.js
  ● fail

    expect(received).toEqual(expected)

    Expected value to equal:
      false
    Received:
      true

      at Object.<anonymous>.test (__tests__/test_bar.js:4:16)
      at Promise.resolve.then.el (node_modules/p-map/index.js:42:16)

  ✕ fail (7ms)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 total
Snapshots:   0 total
Time:        0.596s, estimated 1s
Ran all test suites matching "__tests__/test_bar.js".

单 TS 测试:

$ jest -c __tests__/jestconfig.json __tests__/test_foo.ts 
 FAIL  __tests__/test_foo.ts
  ● fail

    expect(received).toEqual(expected)

    Expected value to equal:
      false
    Received:
      true

      at Object.<anonymous> (__tests__/test_foo.ts:6:16)
      at Promise.resolve.then.el (node_modules/p-map/index.js:42:16)

  ✕ fail (116ms)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 total
Snapshots:   0 total
Time:        1.27s
Ran all test suites matching "__tests__/test_foo.ts".

node v8.1.2 也有同样的问题。 我也试过 node v7.10.0,但也没有用

在一个 React 项目中,我尝试了 Jest,因为使用 Jasmine 完全是为了用whatwg-fetch测试 HTTP 调用、Node.js 执行和 Babel 转译。 但是当我看到目前使用 Jest 时您无法打印到控制台时,就不能使用这个框架了。 Node.js 7.10 和 Jest 20.0.4 存在问题。

最后,通过在全局范围内声明xmlhttprequest并使用nock作为假服务器,我能够使用 Jasmine 和 Node.js 执行设置所有测试环境。

错误可能很难捕捉和修复。 但这是一个 6 个月前报道的 P0,它将阻止任何人认真地将 Jest 视为任何 React 项目的测试框架。

在运行jest --verbose时,我在 Jest 19.0.2 和 Node 7.10.0 上遇到了与@davidgilbertson的屏幕截图(测试结果覆盖 console.log)相同的问题。 对我有什么帮助:使用jest --verbose --runInBand它工作正常(第一个测试结果,然后是所有的 console.log)。

@cpojer @thymikee你能重新打开这个问题以便引起注意吗?

@iffy ,您能否为您的重现创建一个单独的问题? 我会尝试对其进行分类,看看有什么问题。
顺便说一句,低于失败的期望将永远不会被调用,因为期望抛出。

@thymikee完成(虽然我已经改用摩卡咖啡——所以不用担心分类)

我也有这个问题,即使在阅读了所有这个线程并尝试了所有方法之后,我也无法解决这个问题。 我的测试非常简单,因为我刚刚在我的应用程序中实现了jest ,即使如此console.log也没有显示。

然后我尝试使用winston来记录输出文件并且它起作用了。 然后我尝试使用winston登录控制台,猜猜怎么着,它奏效了!

所以我建议你们也这样做。 检查我的logger.js文件:

'use strict';

const winston = require('winston');

const customColors = {
  trace: 'white',
  debug: 'blue',
  info: 'green',
  warn: 'yellow',
  crit: 'red',
  error: 'red'
};

let config = {
  colors: customColors,

  levels: {
    trace: 0,
    debug: 1,
    info: 2,
    warn: 3,
    crit: 4,
    error: 5
  },
  transports: [
  ]
};

config.transports.push(
  new(winston.transports.Console)({
    name: 'consoleLogger',
    level: 'error',
    colorize: true,
    timestamp: true
  })
);

const logger = new (winston.Logger)(config);
winston.addColors(customColors);

module.exports = logger;

在测试文件中只使用:

let log = require('./logger.js');
log.debug('some log here!');

Winston 之所以有效,是因为它使用process.stdout.write来解决 Jest 中的这个错误。 我最终使用 node 的util模块制作了我自己的 console.log。

@eranimo @Daymannovaes查看错误 #3853

该评论说它适用于 8.1.2,但我尝试过,但没有成功。 我已经切换到 mocha 因为这是一个非常糟糕的错误。

这个错误会在下一个版本中修复吗? 另外,我在哪里找到那是什么时候?

我无法升级到最新版本的节点(不是一个选项),所以这不是解决方案。 我可以制作自己的记录器实用程序,我可以把它弄乱。 我正在考虑转换为 mocha,但这取​​决于我的记录器 util 实验的进展情况。

请尽快修复,控制台日志对编写我的测试非常有帮助。

我已经暂时降级到 19.0.2 并且正在运行。

我遇到了同样的问题,只是用最新版本的 node.js 对其进行了测试。 它现在有效。 :100:

从 Node.js v7.10 迁移到 v8.1 后,它也对我有用。

7.4.0 -> 8.2.1更新节点时为我修复

在 node v8.4.0 和 Jest 21.0.0-beta.1 上获得这个。

仅使用test.only运行单个测试用例时,不会显示 console.log 输出。

但是,如果我删除--testPathPattern file并运行所有测试,则会显示输出。

此外,如果我添加await Promise.delay(100)作为测试的最后一步,则会显示输出。

对此评论表示抱歉,但这是他们让 Jest 实时访问 console.log 的一种方式,而不是在测试通过或失败之后。 我的测试使用了一个 while 循环 我试图在循环运行时记录值?

@nharrisanalyst使用--verbose标志

谢谢你的回应,但我使用这个标志,并且只有在测试通过或失败后才使用 console.log() 。 所以如果我的 while 循环卡住了,我在测试时不能用 console.log 调试它,因为测试既不通过也不失败,它只是卡在一个循环中。

Jest 似乎吃掉了我在setupFilessetupTestFrameworkScriptFilebeforeAll所做的任何控制台操作,从而无法编写要求用户输入和验证命令的测试设置脚本线标志。 发生或不发生"verbose": true

分享我对 console.log() 的观察结果,在使用 Jest 运行测试时没有显示。

这样做的先决条件是运行带有--verbose标志的 Jest。

如果您使用多个测试文件运行测试,则 console.log() 的输出是不可见的(大部分时间)。
如果 Jest仅从一个测试文件运行测试,则 console.log() 会按预期工作。

您可以通过以下方式解决此问题:

  • 仅从 1 个文件运行 Jest 测试。 是的...根本不现实,所以请看下一个选项。
  • 使用--maxWorkers=1标志。 不知何故,这对我来说很好用。 我的猜测(*)是... Jest 在同一个进程中运行,并且不需要缓冲每个进程的 stdout 以将它们通过管道返回到主进程。

如果我的猜测(*) 是预期行为,我建议更新文档以明确指出它,以避免开发人员浪费时间试图找出“为什么我的 console.log() 不显示......有时”。

好吧,这对包括我在内的一些人来说仍然是一个问题。 我想这将继续成为一件事。

从我的测试来看,Jest 在输出日志之前退出了进程,这意味着看起来日志正在被吞下。

对我来说,我在我的 jest 配置中设置了verbose: truebail: false 。 Jest 将一直持续到所有测试都运行并输出所有错误和日志。 这是有利的。 我还运行了--runInBand ,它与设置--maxWorkers=1

最大的帮助是bail: false因为这允许所有测试运行直到完成。 它仍然以代码1退出,但我可以再次看到所有日志。

使用节点 v8.1.4 运行 Jest v19.0.2。

运行--verbose --testPathPattern=<path/to/file>导致打印日志。 否则,它会被吞下。

谁能提供在 jest 21.2.0 和当前节点(例如 4.8.4、6.11.4 或 8.7.0)上失败的小型复制品?

无需配置verbose或额外的笑话配置,当我将我的节点版本从7.4.0升级到8.0.0时,问题就消失了。 这就是我的观察。

使用[email protected]

这太令人沮丧了! 我有所有东西的最新版本,但 Jest 仍然在看似随机的地方切断 console.log 输出。 这使得调试失败的测试变得非常困难。

我刚刚找到了这个问题的答案! 如果关闭详细模式,所有的 console.log 输出都会出现! 我认为当 Jest 输出是冗长的东西时,它会将它写在最后几个 console.logs 输出的顶部。

您是否有一些代码始终如一地重现这一点? 可能会帮助我们消除导致问题的潜在不一致。

我用expect(<value>).toEqual("someImpossibleValue")bail: false来解决这个问题,只是试图修复损坏的东西。 绝对不理想,但又快又脏……

也许你可以引入一个与 expect() 类似但不保释的假设() 函数。

运行 v 22.0.4 no console.log .... 将此添加到我不推荐玩笑的许多其他原因之一

@mvolkmann感谢您提供有关详细模式的提示。 如果非详细模式是开玩笑的默认模式,那么考虑更改可能是值得的。 你在代码中放置的 console.logs 没有显示对我来说似乎并不直观。 当测试失败时,这是人们尝试的第一个也是基本的事情。

(节点 v9.3.0 和 jest v20.0.4 在这里)

jest ^21.2.1node 8.9.4

Jest 有时仍然不会抛出控制台日志, --verbose选项不能为我解决问题。 我不明白为什么这个问题被关闭了。

@fega因为没有人提供我们可以提取和测试的复制案例。

$ jest --verbose

此命令将显示所有控制台日志

@odykyi对我不起作用。 开玩笑 22.1.0 和 v8.9.4

奇怪的行为。 如果我将verbosefalse我的 console.log 语句就会被打印出来。

[email protected][email protected] ,并使用--forceExit ,我没有看到的输出console.log从我的测试代码,除非我明确地设置verbosefalse或删除--forceExit标志(我暂时使用)。

[email protected][email protected]和使用 --forceExit 上,我看不到测试代码中 console.log 的输出,除非我明确将详细设置为 false 或删除 --forceExit 标志(我暂时使用)。

看到与上述完全相同的行为。 [email protected][email protected]

在调用done()之前的 console.logging ,但输出未显示为--forceExit 。 当--forceExit被移除时,console.log 输出会显示在最后。

Test Suites: 1 passed, 1 total
Tests:       35 skipped, 1 passed, 36 total
Snapshots:   0 total
Time:        2.512s
Ran all test suites matching /test\/api.test.js/i.
  console.log test/api.test.js:247
    bar

因此,在强制退出刷新之前,无论输出缓冲区 jest 内部有什么,这不是明显的解决方案吗?

我们有一个测试用例: https :

有人可以建立一个我们可以看看的复制回购吗?

快速补充: jest --no-cache似乎也意味着 console.logs 不显示。

使用 Node 9.7.1 和带有 babel 7 的 jest 22.4.2 使用 verbose 似乎可以很好地显示测试中的控制台日志:

包.json

"dependencies": {
  ...
},
"jest": {
  "verbose": true
}

自从不需要用户干预以来已经有一段时间了,但似乎补救措施是一致的。

这个问题现在也一直困扰着我们很长一段时间,首先是输出被随机截断,现在输出完全被忽略。 要复制,请克隆此 repo 的分支 dev/dexie-search-index:
[email protected] :WorldBrain/Memex.git

在 src/search/index.test.ts 的 insertTestData() 的某处添加这一行:
console.log('!?!?!?!!?!?!!?'); expect(1).toBe(2)

使用 Node.js 版本 6.11 和 8.10 进行测试。 请尽快解决此问题,因为它会使编码速度变慢:(

@frankred谢谢。 我设置了verbose: "false"并且它有效。

昨天偶然发现了这个问题https://github.com/evanw/node-source-map-support/issues/207 ,它看起来与这里的这个问题非常相似。

这是有问题的原因是因为写入 Node.js 中的 process.stdout 有时是异步的,并且可能发生在 Node.js 事件循环的多个滴答上。 但是,调用 process.exit() 会强制进程退出,然后才能执行对 stdout 的额外写入。

https://nodejs.org/api/process.html#process_process_exit_code

我没有检查代码,但如果process.exit()--forceExit ,它会解释为什么日志输出丢失。

刚刚在这个相关问题中添加了一个对我有用的解决方案: https :

@ledbit这对我不起作用。 哇,一个跨越一年半的问题,仍然没有解决方案。

这是真的,但开发人员仍然没有太多事情要做。

我在异步示例中的嵌套异步调用中最常发现此问题。 我不太确定其他人的情况,但展示它对 console.log 的使用肯定有助于解决这个问题。

这当然发生在我身上。 你需要我做什么才能修复它?

2018 年 3 月 22 日上午 8:32,Dennis Brown [email protected]写道:

这是真的,但开发人员仍然没有太多事情要做。

我在异步示例中的嵌套异步调用中最常发现此问题。 我不太确定其他人的情况,但展示它对 console.log 的使用肯定有助于解决这个问题。


您收到此消息是因为您发表了评论。
直接回复本邮件,在 GitHub 上查看https://github.com/facebook/jest/issues/2441#issuecomment-375349444 ,或将线程静音https://github.com/notifications/unsubscribe-auth/ADrayIO4NBB2dZM1XL8ZQO32W9SUnu2yks5tZMLV.84

更好的是,去吧! 这是我的回购。 https://github.com/RALifeCoach/handandfootserver.git

从 npm 运行 jest 或从命令行运行。 你会看到有很多很多的console.logs,但大部分都被掩盖了。

在那里 - 开发团队拥有他们需要的一切。 请修复此问题。

2018 年 3 月 22 日上午 8 点36分,Christopher Oliphant

这当然发生在我身上。 你需要我做什么才能修复它?

2018 年 3 月 22 日上午 8:32,Dennis Brown < [email protected] [email protected] > 写道:

这是真的,但开发人员仍然没有太多事情要做。

我在异步示例中的嵌套异步调用中最常发现此问题。 我不太确定其他人的情况,但展示它对 console.log 的使用肯定有助于解决这个问题。


您收到此消息是因为您发表了评论。
直接回复本邮件,在 GitHub 上查看https://github.com/facebook/jest/issues/2441#issuecomment-375349444 ,或将线程静音https://github.com/notifications/unsubscribe-auth/ADrayIO4NBB2dZM1XL8ZQO32W9SUnu2yks5tZMLV.84

@RALifeCoach现在正在查看您的存储库,那里有相当多的日志记录。 介意指出您特别缺少哪些日志记录吗?

运行。 你会看到一些输出,但很多都被覆盖了。

在周六,2018年4月14日,上午3:10泗门Bekkhus [email protected]
写道:

@RALifeCoach https://github.com/RALifeCoach现在查看您的存储库,
那里有相当多的日志记录。 介意指出哪个登录
特别是你失踪了?


你收到这个是因为你被提到了。
直接回复本邮件,在GitHub上查看
https://github.com/facebook/jest/issues/2441#issuecomment-381318608或静音
线程
https://github.com/notifications/unsubscribe-auth/ADrayHQCc8C0NmMmrtE7mEo2jN999CChks5tocsKgaJpZM4LVbUv
.

我不确定你所说的覆盖是什么意思。 是否有输出到控制台然后清除?

如果使用 console.log 编写了 6 行,则 6 会短暂出现,然后
测试摘要与 6 行中的一些重叠。

2018 年 4 月 14 日,星期六,上午 8:58 Simen Bekkhus通知@github.com
写道:

我不确定你所说的覆盖是什么意思。 是否有东西输出到
控制台然后清除?


你收到这个是因为你被提到了。
直接回复本邮件,在GitHub上查看
https://github.com/facebook/jest/issues/2441#issuecomment-381339074或静音
线程
https://github.com/notifications/unsubscribe-auth/ADrayF0P5SqpHjaAAYcPaIAF7ubSMVRTks5tohyIgaJpZM4LVbUv
.

我也在体验@RALifeCoach所描述的内容。 当测试启动时,我会看到我的日志输出在屏幕上闪烁,然后当我向上滚动时,该输出不再存在。

即使在节点 8.11.1 上,这似乎仍然是一个问题。 也许我们应该提交一个新的错误并参考这里?

在 node v8.9.0 中仍然存在同样的问题。

我可以确认@RALifeCoach关于日志输出被“覆盖”的评论——我终于通过用特定的字符串(例如@@@ )标记每个日志并运行来显示日志:

yarn test --verbose | grep '@@@'

这是一个可怕的黑客(你失去了所有的控制台着色,但你仍然会看到测试失败和最终的测试摘要)但这是迄今为止唯一有效的方法。 我在上面的评论中尝试了所有其他方法。 请注意,此解决方案需要--verbose arg(并且它通过react-scripts--watch隐式组合)。

[使用react-scripts forked 使用最新的Jest v23.0.0, node v8.11.2]

在 package.json 中设置"verbose": true有帮助。 日志显示在输出的底部。

一个封闭问题的人,我仍然看到人们抱怨这个,因为它是 2 年前创建的。

我认为 Jest 中有一些代码对我们开玩笑并“劫持”了 console.log(),
使它成为一个空操作,就像......

console.log = function(){ /* do nothing */}

具有讽刺意味的是,重置 console.log 的补救措施是 - 请参阅https://stackoverflow.com/questions/7089443/restoring-console-log
-- 删除console.log

delete console.log
console.log("Can you hear me now, Jesters...?");

……突然之间——瞧! -- 就像火焰中的凤凰 -- console.log()再次在 Jest 中工作......!
Jest 甚至会在记录您的消息之前打印出“console.log(位置信息)”...

>

控制台日志 __tests__\libarray-helpers.test.js:35
你现在能听到我吗,小丑……?

另外,我最近一直在使用同构的“logatim” https://www.npmjs.com/package/logatim代替 console.log(),它
似乎对 Jest 的劫持企图免疫...(也许它会重置 console.log...)

你甚至可以先发制人地“劫持”console.log 自己logatim
以绿色记录“信息”级别的消息...

// const logatim = require('logatim') // ES5
import logatim from 'logatim' // ES6
/* ... */
console.log = function(...args){ logatim.green.info("[INFO]",...args) } // ES6

(请不要将我的玩笑解释为好战......如果你不能开玩笑一点点开玩笑的话,命名一个好的产品 Jest 的乐趣在哪里......)

在传播仇恨之前, @yanshuf0考虑一下您显然从中受益的免费和开放工具。 您选择使用 Jest。 如果你不喜欢,你可以选择离开(或者自己修复,团队友好,对 PR 开放)。

我遇到了这个“覆盖”问题(Windows 10、VS Code 终端、node.js 项目),然后当我摆弄它时,错误停止发生。 我认为它停止发生是因为我停止使用--watch或者因为我添加了"verbose": false选项,但是恢复这些更改并没有使错误再次出现。

我不得不问,Jest 是不是故意不将日志输出与生成它的测试相关联? 有一段时间,所有控制台输出都低于所有测试结果,但现在它显示在所有测试结果之上。 好随便喔。

--watchAll 标志阻止了它。 现在它对我有用

在使用 jest 数月之后,这也发生在我身上,节点 8.9 也突然发生了。 一分钟 console.log 输出得很好,下一分钟它就停止工作了。 我结束了这个线程并尝试了一些事情。 不使用--watch解决了这个问题,但是我每次都不得不重新运行我的测试命令。 使用--watch --verbose false修复了问题,并会自动运行我的测试。

在这里发现同样的问题,感谢临时修复@bkempner

可以确认这是 22.4.4 和 23.4.1 中的问题(截至本评论的当前版本)。 我使用的标志是:

$ jest --forceExit --runInBand --bail --ci --json --outputFile=/tmp/jest_results.json

同一主题的另一个问题建议添加--json选项,该选项确实有效了一段时间......也许从那时起某些依赖项发生了变化,但始终抑制 STDOUT 和 STDERR 输出。 我最接近任何有效的方法是使用--watch ; 有时,某些输出会被添加到末尾而不会被覆盖。

我发现--silent默认为 true,设置为 false 会输出 console.log: jest --silent=false

似乎仍然有大量关于此的报道,显然某些内容仍然存在问题。 这是作为#2166 的欺骗而关闭的,现在已关闭,但这种情况仍然存在。

@thymikee我们可以重新打开这个问题吗?

我正在重新打开这个,因为问题已经部分恢复了,我们需要修复它。

在 v23 中,问题出现在 watch 模式中,因为我们已经改变了它在后台的工作方式,几乎总是并行运行测试,所以 TTY 不会被阻止,并且可以轻松取消长时间运行的测试: https://github。 com/facebook/jest/pull/6647。
我们没有在监视模式下生成工人的唯一情况是,当我们正好有 1 个测试要运行并且它相对较快(运行时间低于 1 秒)时——在这种情况下,我们仍然应该看到console.log s 像往常一样出现。

就我而言,在监视模式下运行所有​​测试确实记录正确。 如果我使用模式模式过滤到一个测试类,那么日志记录会被截断

按照由@davidgilbertson(https://github.com/facebook/jest/issues/2441#issuecomment-286248619)删除注释verbose: true在我的package.json和删除--verbose从我命令行标志允许我查看隐藏的控制台日志。 这很令人困惑。

我的 package.json 中有verbose: true并且我发现console.log语句有时在那里,有时不在(如果我总共有 10 个,它们似乎出现了,但没有只是一个)-我认为这可能是一个异步问题

我偶尔也有这个问题,我启用了runInBand (https://jestjs.io/docs/en/cli.html#runinband) 并修复了它。

@ndelangen这很好奇 - 我想知道这是否可能是一个异步问题。 我以为 Jest 收集了所有 console.logs 然后在最后打印它们,不是吗?

即使我没有使用verbose ,问题现在也再次出现。

--runInBand不适合我。 到目前为止,唯一可靠的解决方法是多次记录某些内容,以便某些输出不会被开玩笑覆盖。

我做了一些分析,添加了一些评论并设法在这里创建了一个部分补丁:

https://github.com/facebook/jest/issues/3853#issuecomment -413622844

编辑:

包含可在此处轻松复制的代码的 repo: https :

这里的输出分析: https :

补丁是部分的,因为

  • 由于输出的必要更改,许多集成测试现在都失败了
  • 有时(不幸)日志输出上次更新状态后出现-的原因可能是子进程流子进程发送成功消息父被刷新的事实。

@philraj对我来说同样的问题..我必须多次登录才能可靠地查看预期的日志消息

这怎么不是一个主要问题并且没有尽快得到解决? 自 2016 年以来,这个问题是如何开放的??

更新:有了这个补丁,我只有 8 个失败的测试:

diff --git a/packages/jest-runner/src/index.js b/packages/jest-runner/src/index.js
index 2f4dd724..618a8cbf 100644
--- a/packages/jest-runner/src/index.js
+++ b/packages/jest-runner/src/index.js
@@ -97,11 +97,14 @@ class TestRunner {
     // $FlowFixMe: class object is augmented with worker when instantiating.
     const worker: WorkerInterface = new Worker(TEST_WORKER_PATH, {
       exposedMethods: ['worker'],
-      forkOptions: {stdio: 'inherit'},
+      forkOptions: {stdio: 'pipe'},
       maxRetries: 3,
       numWorkers: this._globalConfig.maxWorkers,
     });

+    worker.getStdout().pipe(process.stdout);
+    worker.getStderr().pipe(process.stderr);
+
     const mutex = throat(this._globalConfig.maxWorkers);

     // Send test suites to workers continuously instead of all at once to track
diff --git a/packages/jest-worker/src/worker.js b/packages/jest-worker/src/worker.js
index 5eee64af..17d76d36 100644
--- a/packages/jest-worker/src/worker.js
+++ b/packages/jest-worker/src/worker.js
@@ -87,6 +87,13 @@ export default class {
   }

   _initialize() {
+    const forceColor =
+      'FORCE_COLOR' in process.env
+        ? process.env['FORCE_COLOR']
+        : // $FlowFixMe: Does not know about isTTY
+          process.stdout.isTTY
+          ? '1'
+          : '0';
     const child = childProcess.fork(
       require.resolve('./child'),
       // $FlowFixMe: Flow does not work well with Object.assign.
@@ -94,6 +101,7 @@ export default class {
         {
           cwd: process.cwd(),
           env: Object.assign({}, process.env, {
+            FORCE_COLOR: forceColor,
             JEST_WORKER_ID: this._options.workerId,
           }),
           // Suppress --debug / --inspect flags while preserving others (like --harmony).

它们主要是关于在 process.env、hg scm 和packages/jest-runner/src/__tests__/test_runner.test.js不期望 FORCE_COLORS 没有完全模拟流(因此它们上没有管道方法。

按照这个速度,我将能够在下周提交修复这个问题的 PR……前提是我找到了对整个报告完成后出现的日志输出的修复。

正如@bkempner所说,使用--watch --verbose false解决了这个问题。

--watch中的控制台输出被开玩笑地移动光标所覆盖,这与我所看到的一致。 存在/不存在--verbose--maxWorkers 1--runInBand不会产生成功。

我目前的解决方法是jest --watch | cat 。 我失去了所有颜色并停留在窗口顶部,但我得到了控制台输出。

或者, TERM=dumb jest --watch 。 我失去了停留在窗口顶部的机会,但我得到了颜色和控制台输出。

我有同样的问题。

对我有用的是使用console.debug

TERM=dumb也为我修复了

FWIW,TERM=dumb 也为我修复了它

在 jest 配置中禁用verbose对我有用 0_o\

--verbose false到 package.json "test" 脚本为我解决了这个问题。 如果没有这个线程,我永远不会发现。

例如

"scripts": {
    "test": "jest --watch --verbose false"
}

奇怪的是,最后一个控制台中的一些消失了,但不是全部消失了,在我的 watch 命令中用--verbose false修复了它。

当你在没有--watch情况下运行时工作正常,所以它是关于监视标志的。

具有讽刺意味的是,当console.log 工作时,它更加冗长!

我已经开始注意到 Jest 23.6 中的详细问题,我回滚到 23.5 并且我仍然看到它。 如果我运行--clearCache这会修复冗长一段时间,直到它再次失败。 我不清楚触发器是什么,例如很多日志失败或类似的东西。 一旦发生这种情况,它似乎会导致 Jest 破坏缓存。 我正在尝试--verbose false ,看看是否会阻止它继续前进。

谢谢@jamespolanco使用--clearCache选项为我解决了这个问题(暂时)。 我将使用--no-cache选项运行我的测试,看看是否可以防止问题在未来再次发生。

编辑:我应该提到我的问题是只有我的一些console.log消息被打印出来。 我在一次测试中使用了 5 console.log行,并且只打印了前 3 行。 使用--clearCache为我解决了这个问题。 也许有一个不同的问题没有console.log出现?

我也有这个问题。 我曾尝试使用 console.log、console.debug 和 console.error。 我也尝试过使用 --no-cache 标志。 在所有情况下,我的控制台语句都被完全忽略了。

我在手表模式下也有这个问题。 版本 23.6.0

如果有人喜欢自己看,我什至记录了它:
asciicast

像其他人一样 - 只有在使用--watch运行时才会被擦除。 试过--verbose false并没有帮助。

我也有同样的问题。

在使用详细或处于监视模式时,我也遇到了这种情况

信不信由你,我有时会记录抛出错误。 在我的情况下,也做node --inspect node_modules/.bin/jest --runInBand mypath/to/my.test.js显示了真实的console.log输出。

节点 v9.11.1
玩笑:v23.6.0

package.json Jest 配置:

  "jest": {
    "preset": "react-native",
    "verbose": true,
    "testEnvironment": "node",
    "haste": {
      "defaultPlatform": "android",
      "platforms": [
        "android",
        "ios",
        "native"
      ],
      "providesModuleNodeModules": [
        "react-native"
      ]
    },
    "setupFiles": ["<rootDir>/__tests__/setup"]
  },

我确认这个问题是冗长的。 问题是当启用详细时,行数计算会混乱。

如果有人可以指出我打印消息的地方,我可以尝试一下。

您可以暂时使用jest-watch-toggle-config减轻发行量。

像这样设置:

module.exports = {
  "watchPlugins": [
    ["jest-watch-toggle-config", { "setting": "verbose" }]
  ]
}

运行测试时,按v启用详细,然后再次按v禁用它。

之后,只要你保持详细,你就可以看到所有的日志。

--verbose=false为我解决了测试酶浅时的问题。 但是,console.logs 在没有修复酶安装的情况下工作。

这表明反应测试渲染器记录错误的方式与反应的内置渲染器记录错误的方式之间存在差异(因为酶根本不会干扰控制台功能)

仅供参考,此 PR 为我解决了问题 - https://github.com/facebook/jest/pull/6871

它还没有准备好,它可能需要改变方法 - 但它确实以详细模式显示所有记录的数据。

尚未更新(运行 jest 22.4.2)但使用监视模式我的日志不会显示。 使用--runInBand运行在监视模式下修复了它。

    "test": "jest --watch --runInBand",
    "test:once": "jest",

我也没有更新(Jest 23.6.0),并且运行“jest --watch --verbose=false”也为我修复了它。

希望有问题的人来测试上面提到的 PR。 它在jest@beta可用(现在24.0.0-alpha.9

所以纱线添加jest@beta ?

上。 19. 德。 2018 吉隆坡 16:46 skrev Simen Bekkhus通知@github.com:

希望有问题的人来测试上面提到的 PR。 它是
jest@beta 中可用(现在 24.0.0-alpha.9)


您收到此消息是因为您订阅了此线程。
直接回复本邮件,在GitHub上查看
https://github.com/facebook/jest/issues/2441#issuecomment-448641697或静音
线程
https://github.com/notifications/unsubscribe-auth/AAM5P7ijQjSbWB0-zzDCfC9Uggyk5RGoks5u6l9EgaJpZM4LVbUv
.

>


塔吉·胡斯
美孚:920 63 413

@tarjei ,是的:

yarn add --dev jest<strong i="7">@beta</strong>

它对我有用。 🎉

这真的很愚蠢,但以防万一它对其他人有帮助,我正在开发一个新的(对我而言)项目 - jest 正在使用--silent选项运行,该选项会禁用输出。 删除它,我现在看到日志🤦‍♂️

注意当启用详细时(我使用jest-watch-toggle-config切换它),一些控制台日志在测试版中被阻止。

--详细=假

这对我有用。

我注意到有些console.log()可以工作,而其他人没有在我的测试中(节点 v8,[email protected]

const something = () => new Promise(resolve => {
  console.log('NOT logged for some reason!')
  setTimeout(resolve, 100);
});

describe('Something', () => {
  it('logging works in non-async test', function () {
    console.log('logged 1')
    console.log('logged 2')
    expect(true).toBe(true);
  });

  it('console log does not work well in async test', async () => {
    console.log('logged 3')
    await something();
    console.log('NOT logged!')
    expect(true).toBe(true);
  });
});

/* Output:
> logged 1
> logged 2
> logged 3
*/

发生了一些非常奇怪的事情, async测试中没有记录异步测试中的第一个console.log ,也没有记录await之后的那个。

async测试中再添加一些console.log ,您会开始注意到更奇怪的行为,例如在await突然工作之后的一些日志🤷‍♀️ 🤷‍♂️

所以, @philwhln 两年前写的

由于我无法在一个简单的测试中隔离它,我猜它与运行更复杂的异步测试有关。

似乎有些道理。

--详细=假

在这种情况下也为我工作。

@DanweDE你能检查一下最新的 alpha yarn add jest<strong i="6">@beta</strong> --dev是否为你解决了这个问题,即使详细设置为true

添加--verbose false解决了这个问题。 这似乎有点不直观:)

这是固定的吗? 我仍然没有看到 "jest": "23.6.0" 上的 console.logs

@iDVB如果你阅读了上面的几条评论,你会看到有一个测试版可以解决这个问题。 尝试并报告它是否解决了您的问题以帮助@spion

此外,每个来这里说--verbose false--verbose true或任何标志组合或 Node 或 Jest 版本的人都解决了他们的问题,请尝试测试版并报告它是否在没有您的解决方法的情况下解决了您的问题。

我正在测试的类中的控制台日志确实出现了

@philraj我们已经切换到测试版"24.0.0-alpha.9"@leaplabs和它完美的作品。 从某种意义上说,自从我们升级以来,我没有看到任何日志消失。

也可以确认,在没有任何命令行参数的情况下适用于24.0.0-alpha.9

我对 React 和 Jest 比较陌生。 我无法使用 create-react-app 中的默认值获得一致的日志。 我弹出了,现在日志工作正常。 我不认为弹出改变了 Jest 的版本。 也许这只是改变了 Jest 运行方式的一项设置。 这是23.6.0

使用24.0.0-alpha.16除非添加verbose=false否则我看不到任何控制台日志。

我在[email protected]也得到了非常不一致的结果

--verbose=false为我解决了这个问题 🎉

我正在使用24.1.0并且即使没有详细选项它也能工作。 但是,当测试文件包含 eg 时,它不会在测试文件中输出任何console.log语句。 对类的引用,即未导入。 例如

image

这是ts-jest的错误,与此处无关

是的,但是当发生该错误时,不会显示控制台日志输出。 这仍然与ts-jest吗? 我不太熟悉 jest 周围的每个库负责什么。

IDK ts-jest工作的,但如果它不对类型错误运行任何测试,那就可以解释为什么它们会丢失——代码永远不会运行

我仍在努力让console.log在这里工作。 我偶尔会收到日志,但似乎没有明显的成功模式。

我正在使用 Jest 24.7.1并且也尝试过24.7.124.2.0-alpha.0

设置verbose=falseverbose=true都未能提供修复。

我也试过使用节点v10.8.0v6.17.1 ,也没有修复。

这里有什么遗漏吗?

@mulholio您是否 100% 确定您正在运行本地安装的玩笑? 我报告了过去仅发生的问题,因为我有一个旧的全球版本的包正在运行,而不是本地安装的包。

是的,没有安装 Jest 的全球版本

我可以确认它没有得到解决。 有时 console.log 有效,有时无效,我多么困惑。
我的环境如下:
开玩笑 23.6.0
节点 v8.13.0
和我的 jest.config.js

const path = require('path');

module.exports = {
  moduleNameMapper: {
    "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/__mocks__/fileMock.js",
    "\\.(less|css|scss)$": "<rootDir>/__mocks__/cssMock.js",
    "^@\/(.*)$": "<rootDir>/src/client/$1",
  },
  bail: true,
  setupTestFrameworkScriptFile: "<rootDir>/setupTests.js",
  collectCoverageFrom: [
    "src/client/**/*.{js,jsx}",
  ],
  verbose: true,
  coverageReporters: ["text", "text-summary", "lcov", "json"],
  coveragePathIgnorePatterns: ["src/client/index.js"],
}

是的,在删除verbose:true 后,似乎没问题

我也看到这个错误,我们可以重新打开这个问题吗?

仅供参考:如果我使用fit运行单个测试,我的console.log没有输出任何内容。 当我运行整套测试时, console.log工作得很好。

遇到同样的问题,一些控制台日志被“吃掉”了。 对于遇到此问题的人,您能否验证但克隆多个控制台日志?

console.log('ok');
console.log('ok');
console.log('eaten up');

看起来 [PASS] 语句的缓冲区正在写入最后 2 个控制台日志行(我可以在 Pass 语句的末尾看到部分控制台日志行号)

+1000

听起来很傻,但请确保在测试前yarn build

使用[email protected]时仍然没有--verbose=true--verbose=false [email protected] - 不知道为什么它在最初记录 3 年后仍然是一个问题。

您是否尝试过使用 jest 标志--runInBand来查看是否通过连续运行测试来解决它? 有人向我提到了这一点,但还没有机会进行测试。

谢谢,它有效! 但为什么不将其设置为默认输出 console.log ..

这对我来说仍然是个问题, [email protected]

我实际上找到了一个修复程序,最后一个测试用例(级联)中的最后 2 行被覆盖,因此,将此作为您的最后一个测试用例

it('bugfix for [email protected]', () => {
  console.log("[email protected] bug|last 2 lines get override. remove this once 24.8.0 gets fixed");
  console.log("[email protected] bug|last 2 lines get override. remove this once 24.8.0 gets fixed");
});

对于那些使用ts-jest ,我必须关闭诊断才能看到 console.logs
jest.config.js

  globals: {
    'ts-jest': {
      diagnostics: false,
    },
  },

对于那些使用ts-jest ,我必须关闭诊断才能看到 console.logs
jest.config.js

  globals: {
    'ts-jest': {
      diagnostics: false,
    },
  },

这个选项对我们不起作用。 我们还尝试设置verbose = false也没有帮助。

我们的环境:

  • 节点 10.16.0
  • 开玩笑 24.8.0
  • ts-jest:24.0.2
  • 打字稿 3.5.2
  • @types/jest 24.0.15

看起来 [PASS] 语句的缓冲区正在写入最后 2 个控制台日志行(我可以在 Pass 语句的末尾看到部分控制台日志行号)

这对我来说似乎确实如此([email protected])。 在我的系统上,带有 [PASS] 的终端输出行似乎在清除之前闪烁了一些内容。

也遇到这个问题。

我无法使用上述任何解决方案进行登录,但作为一种解决方法,我只是期望该值会失败并检查差异:

expect(thingIWantToLog).toBe({})

也遇到了这个问题:似乎“PASS:...”输出覆盖了标准输出,因此您的“最后一个”console.log 将被吃掉。

如果--verbose=false不起作用,您可以在最后一个 console.log 中添加一堆牺牲换行符 ( \n )。

您是否尝试过使用 jest 标志--runInBand来查看是否通过连续运行测试来解决它? 有人向我提到了这一点,但还没有机会进行测试。

添加此标志有助于对问题进行排序。
有时它也没有显示 console.log 输出。
使用这个命令:
npm test -- --verbose --runInBand -t "My Test Name"

节点和 NPM 版本:
node v8.16.0
npm 6.4.1

这是我的解决方法:

npm install --save-dev sprintf-js

在你的玩笑中setupTest.js ,或任何地方:

import {sprintf} from 'sprintf-js';

console.log = (msg, args) => {
    const str = sprintf(msg, args);
    process.stderr.write(str + '\n');
  };

使用[email protected]时仍然没有--verbose=true--verbose=false [email protected] - 不知道为什么它在最初记录 3 年后仍然是一个问题。

这是我的jest.config.js ,它对我有用。
jest -v 23.6.0 & node -v 8.11.2

module.exports = {
  clearMocks: true,
  moduleDirectories: [
    'node_modules',
  ],
  testEnvironment: 'node',
  testMatch: [
    '**/__tests__/**/*.js?(x)',
    '**/?(*.)+(spec|test).js?(x)',
  ],
  verbose: false,
};

然后在package.json我有:

"scripts": {
  "test": "jest --config ./jest.config.js",
}

然后使用以下命令运行您的特定测试套件:

yarn test -- -t 'test-suite-name-here'

--verbose=false似乎对我有用。 谢谢!

当你传递--silent选项时开玩笑隐藏日志和警告
试试yarn jest它应该可以工作

这个bug好烦啊……3年了……

关闭--静音
以及使用 ts-jest @mr-madamin 解决方案的 ts 测试对我有用!

不使用verbosesilent ,尝试过--runInBandTERM=dumb ,运行所有测试与单个测试文件,并且console.log出现在放置在设置块中,但不在it()块内。

当所有其他方法都失败时,您仍然应该能够执行以下操作:

require('fs').writeFileSync('./output', data);

但我觉得自己就像一个穴居人,用石头敲碎花生。

编辑: "jest": "^24.9.0"

我正在使用此命令并且它有效:

npm test -- --runInBand -t "My Test Name"

您可以在-t标志后指定您的测试名称,以在相同的describe()下运行单个测试或测试组。

不使用verbosesilent ,尝试过--runInBandTERM=dumb ,运行所有测试与单个测试文件,并且console.log出现在放置在设置块中,但不在it()块内。

当所有其他方法都失败时,您仍然应该能够执行以下操作:

require('fs').writeFileSync('./output', data);

但我觉得自己就像一个穴居人,用石头敲碎花生。

编辑: "jest": "^24.9.0"

我很高兴终于开始在后端使用 jest 来保持一致性。 相反,我遇到了这个问题,现在我正在切换回 mocha/proxyquire。 没有可见的console.log输出(在模块或测试用例中),在花了几个小时之后,似乎没有任何解决方法有帮助。 对涉及记录到文件的任何解决方法不感兴趣......

使用"jest": "^24.9.0",对节点 8/10 LTS 进行测试

是的。 我也在边缘。 似乎在这里更流行关闭问题,并推荐 hacks 而不是修复明显的痛点超过 3 年。

你好 samlevin 和 pavelloz,
你试过这个选项吗?

我正在使用此命令并且它有效:
npm test -- --runInBand -t "My Test Name"

您可以在 -t 标志后指定您的测试名称,以在同一个 describe() 下运行单个测试或测试组。
你能告诉我它是否有效吗? 因为我已经使用它一段时间了。

这是带有示例代码和输出的屏幕截图。
注意:如果您不知道,console.lg 会打印在所有其他报告的顶部,而不是在您看到代码覆盖率报告或错误恢复的最后。
Jest test console log

我的 Node 和 NPM 版本:

node v8.16.0
npm 6.4.1

我很高兴终于开始在后端使用 jest 来保持一致性。 相反,我遇到了这个问题,现在我正在切换回 mocha/proxyquire。 没有可见的console.log输出(在模块或测试用例中),在花了几个小时之后,似乎没有任何解决方法有帮助。 对涉及记录到文件的任何解决方法不感兴趣......

使用"jest": "^24.9.0",对节点 8/10 LTS 进行测试

我已经测试了这个线程中的每一个解决方案。

只是为了检查这方面是否没有任何变化:
image

bash-5.0$ npm -v ; node -v; cat node_modules/jest/package.json |grep version
6.12.0
v12.11.0
  "version": "24.9.0",

编辑

注意:如果您不知道,console.lg 会打印在所有其他报告的顶部,而不是在您看到代码覆盖率报告或错误恢复的最后。

我什至没有检查报告的底部,但这正是我的日志登陆的地方。 所以我想它有效,只是对每个人都不一致/以同样的方式。

image

谢谢您的帮助。

问题是它对性能的影响有多大,但那是另一天,日志记录更重要。

@pavelloz是对的,当您使用 --runInBand 选项运行测试时,完成测试需要更多时间,因为它会这样做:

--runInBand, -i                 Run all tests serially in the current process
                                  (rather than creating a worker pool of child
                                  processes that run tests). This is sometimes
                                  useful for debugging, but such use cases are
                                  pretty rare.

所以我所做的是只在我需要调试测试中的问题时使用该选项。
所有其他时间,只需正常运行测试。

干杯

const 组件 = 浅(...)
控制台.log(component.debug())

令人难以置信的是,这还没有得到解决。

@ivandosreisandrade我能够验证runInBand标志的解决方法,但此时我不想浪费时间为其他开发人员添加额外的步骤,并且已经恢复到开箱即用的行为。将继续订阅以查看这方面是否有任何变化

我已经尝试了该线程中的所有内容,但仍然看不到 console.log 的输出。 --runInBand 不能为我解决问题。 使用node@12和最新的笑话。 用 web dev 调试已经够难了,如果我至少可以打印到屏幕上看看为什么我的单元测试失败了,那将非常有用

@u84six你试过我的解决方案了吗?
这是我在帖子中的回答的链接。
https://github.com/facebook/jest/issues/2441#issuecomment -552368939

干杯

@ivandosreisandrade发生的情况是,如果代码中有错误(例如引用未定义的值),即使 console.log 调用在错误之前,它也不会打印出来。 如果测试中的一切都通过了,那么我会看到日志。 这种行为使其对调试完全无用。

@ivandosreisandrade你的 package.json 是什么样的? 我正在努力遵循这一点:

npm test -- --runInBand -t "我的测试名称"

但是我在 package.json 中设置了这样的设置

" test:unit ": "jest --verbose"

你会认为使用 --verbose 标志,它会允许 console.log 通过,但我仍然无法让 console.log 工作。 太令人沮丧了!

@ivandosreisandrade你的 package.json 是什么样的? 我正在努力遵循这一点:

npm test -- --runInBand -t "我的测试名称"

但是我在 package.json 中设置了这样的设置

" test:unit ": "jest --verbose"

你会认为使用 --verbose 标志,它会允许 console.log 通过,但我仍然无法让 console.log 工作。 太令人沮丧了!

@u84six这是我的 packadge.json

"scripts": {
    "test": "jest test --coverage",
    ... 
},
...
"jest": {
    "verbose": true,
    "testMatch": [
      "**/tests/**/*.js?(x)"
    ],
    "moduleFileExtensions": [
      "js"
    ],
    "moduleDirectories": [
      "node_modules"
    ]
  }

您的 testMatch 允许.js.jx.jsx文件,并且您的 moduleFileExtensions 仅允许.js 。 那里似乎有些不对劲。

这与原因无关:man_shrugging:
这就是要定位和运行针对它们的测试的文件。

我不确定为什么这个问题被关闭了。 所以这是我的节点版本 - 13.12.10,npm -6.14.4
开玩笑-24.9.0

这是一个使用 mock-fs 的基本测试
从'mock-fs'导入模拟;
从 'fs' 导入 * 作为 fs;
从“泵”导入泵;
import * as util from 'util';

describe('Test suite for bucket functionality', () => {
    beforeEach(() => {
        mock({
            'sample-file.txt': 'Content of the sample file',
            'sample-upload.txt': ''
        });
    });
    test('test upload', async () => {
        const filePromisy = util.promisify(fs.readFile);
        pump(fs.createReadStream('sample-file.txt'), fs.createWriteStream('sample-upload.txt'));
        filePromisy('sample-upload.txt').then(data => {
                       // when I do a console.log() here I get a warning stating that before I do an expect of data , I get a warning (no longer an error) stating that -_Cannot log after tests are done._

        }).catch(err => {

        });



    });
    test('test download', () => {

    });
});

我不确定为什么会发生这种情况。 这是因为只有在执行测试规范后才在 nextTick() 中处理 console.log 的事件循环。 很抱歉提出这个问题,但调试每个测试用例似乎很乏味,而不仅仅是执行控制台 o/p 并检查请求数据。

因为您必须将 filePromisy 承诺返回给 jest,以便它知道您的测试何时完成 - 您的问题与此无关。

我通过简单地将我想要登录的任何内容放入临时expect语句来解决这个问题以进行调试。 因此,不要使用console.log(sketchyVariable) ,而是使用expect(sketchyVariable).toEqual(42)

在 Node 8 上对我有用的东西:
而不是使用console.log ,使用内置调试日志:

const util = require('util')
const myLogger = util.debuglog('myloggername')
myLogger('foobar')

并用调试器标志开始开玩笑:

NODE_DEBUG=myloggername npm test -t "My Test Name"

在观看单个测试时,我看到控制台日志偶尔出现。 有时我会看到所有日志,有时没有,有时我会看到其中一些但不是全部。 每次测试运行时,我都会看到不同的东西。 😒

--verbose=false为我修复了它。 我对此感到惊讶,因为我没有在任何地方将verbosetrue 。 事实证明,如果您正在运行单个测试

如果只有一个测试文件正在运行,它将默认为 true。

https://jestjs.io/docs/en/configuration#verbose -boolean

相关 StackOverflow 线程: https ://stackoverflow.com/questions/48695717/console-log-statements-output-nothing-at-all-in-jest

jest 不能很好地处理多个级别的日志记录。 这应该

  • 默认情况下,捕获并显示所有捕获的日志以进行一次失败测试
  • 可以选择不显示任何内容,并且
  • 有一个选项可以禁用捕获。

而已。 真的不复杂。

我的猜测是,他们正在捕获控制台日志,因为他们试图在运行测试时以合理的顺序打印异步输出。 问题是,如果此日志记录代码对用户不起作用,那么在他们的环境中,他们就会受到很大的打击。

几年前我停止使用 jest,因为在调试测试时我无法可靠地获得控制台输出,我很关心我在这个线程中遵循的建议。

这个故事的寓意是,不要弄乱全局控制台。 曾经。 如果你想提供一个可以打开或关闭的记录器,那就去做吧。 如果我愿意,我会使用它。 但不应干扰全局控制台。

获取 iOS 版 Outlook https://aka.ms/o0ukef


来自:earonesty [email protected]
发送: 2020 年 8 月 12 日,星期三 12:33:23 PM
致:facebook/jest [email protected]
抄送:克里斯·格莱姆斯[email protected] ; 提及[email protected]
主题: Re: [facebook/jest] console.log 在运行测试时不输出 (#2441)

jest 不能很好地处理多个级别的日志记录。 它应该捕获日志并在默认情况下在失败时显示它们,可以选择完全不显示,并且可以选择显示全部。 而已。


你收到这个是因为你被提到了。
直接回复本邮件,在GitHub上查看https://github.com/facebook/jest/issues/2441#issuecomment-673011577 ,或者退订https://github.com/notifications/unsubscribe-auth/AAFCNBK5MQEA6AJHEC52ZWDSALG6HANCNFSM4C2VWUXQ

@halis我已经

我的感觉是 Jest 的主要作用是乐于不时打破预期的行为和语义,如果它极大地改善了测试体验。 像jest.mock(...)的自动提升这样的事情意味着 Jest 测试在语义上并不是严格的 JavaScript(甚至 ECMAScript); 同样的并行性意味着任何返回 void 的内置方法,如console.log都可以并且应该被视为异步,如果它可以提高性能。

那是一件坏事? 显然不一定,因为 Jest 非常成功。 但我确实认为 Jest 有能力偶尔给你带来惊喜。 例如,我很确定 90% 的 Jest 用户不知道他们的代码被 AST 转换为提升模拟调用。

例如,我很确定 90% 的 Jest 用户不知道他们的代码被 AST 转换为提升模拟调用。

什么

尝试使用console.debugconsole.error

在我的情况下,您可以使用--useStderr解决了问题,因为它直接传递消息

https://nodejs.org/api/process.html#process_a_note_on_process_i_o

我今天再次为此而苦苦挣扎, --useStderr标志为我修复了它。 谢谢@diomalta!

我正在努力解决同样的问题,当测试失败时没有显示日志。

我设法让我的console.log通过设置显示verbose: true在我的jest.config

此页面是否有帮助?
0 / 5 - 0 等级