diff --git a/integration_tests/__tests__/__snapshots__/console-test.js.snap b/integration_tests/__tests__/__snapshots__/console-test.js.snap index e76821df8dca..9ad4db7e6ba5 100644 --- a/integration_tests/__tests__/__snapshots__/console-test.js.snap +++ b/integration_tests/__tests__/__snapshots__/console-test.js.snap @@ -55,3 +55,35 @@ Time: <> Ran all test suites. " `; + +exports[`test console printing with jsdom env 1`] = ` +" console.log __tests__/console-test.js:11 + This is a log message. + + console.info __tests__/console-test.js:13 + This is an info message. + + console.warn __tests__/console-test.js:15 + This is a warning message. + + console.error __tests__/console-test.js:17 + This is an error message. + +" +`; + +exports[`test console printing with jsdom env 2`] = ` +" PASS __tests__/console-test.js + ✓ works just fine + +" +`; + +exports[`test console printing with jsdom env 3`] = ` +"Test Suites: 1 passed, 1 total +Tests: 1 passed, 1 total +Snapshots: 0 total +Time: <> +Ran all test suites. +" +`; diff --git a/integration_tests/__tests__/console-test.js b/integration_tests/__tests__/console-test.js index ecbf53cdbd54..fd2bbf13dc09 100644 --- a/integration_tests/__tests__/console-test.js +++ b/integration_tests/__tests__/console-test.js @@ -34,3 +34,14 @@ test('console printing with --verbose', () => { expect(rest).toMatchSnapshot(); expect(summary).toMatchSnapshot(); }); + +test('console printing with jsdom env', () => { + const {stderr, stdout, status} = + runJest('console', ['--verbose', '--env=jsdom']); + const {summary, rest} = extractSummary(stderr); + + expect(status).toBe(0); + expect(stdout).toMatchSnapshot(); + expect(rest).toMatchSnapshot(); + expect(summary).toMatchSnapshot(); +}); diff --git a/packages/jest-cli/src/runTest.js b/packages/jest-cli/src/runTest.js index a7d0f99acda9..8ec2f6f15f07 100644 --- a/packages/jest-cli/src/runTest.js +++ b/packages/jest-cli/src/runTest.js @@ -27,7 +27,6 @@ function runTest(path: Path, config: Config, resolver: Resolver) { /* $FlowFixMe */ const ModuleLoader = require(config.moduleLoader || 'jest-runtime'); - const env = new TestEnvironment(config); const TestConsole = config.verbose ? Console @@ -35,16 +34,18 @@ function runTest(path: Path, config: Config, resolver: Resolver) { ? NullConsole : BufferedConsole ); - const testConsole = env.global.console = new TestConsole( - config.useStderr ? process.stderr : process.stdout, - process.stderr, - (type, message) => getConsoleOutput( - config.rootDir, - !!config.verbose, - // 4 = the console call is burried 4 stack frames deep - BufferedConsole.write([], type, message, 4), - ), - ); + const createCustomConsole = (stackFrameDepth: number): Object => { + return new TestConsole( + config.useStderr ? process.stderr : process.stdout, + process.stderr, + (type, message) => getConsoleOutput( + config.rootDir, + !!config.verbose, + BufferedConsole.write([], type, message, stackFrameDepth), + ), + ); + }; + const env = new TestEnvironment(config, createCustomConsole); const runtime = new ModuleLoader(config, env, resolver); const start = Date.now(); return TestRunner(config, env, runtime, path) @@ -56,7 +57,8 @@ function runTest(path: Path, config: Config, resolver: Resolver) { result.perfStats = {end: Date.now(), start}; result.testFilePath = path; result.coverage = runtime.getAllCoverageInfo(); - result.console = testConsole.getBuffer(); + result.console = env.console && env.console.getBuffer ? + env.console.getBuffer() : null; result.skipped = testCount === result.numPendingTests; return result; }) diff --git a/packages/jest-environment-jsdom/src/index.js b/packages/jest-environment-jsdom/src/index.js index 121cd656ed7f..31eacb129f43 100644 --- a/packages/jest-environment-jsdom/src/index.js +++ b/packages/jest-environment-jsdom/src/index.js @@ -8,6 +8,7 @@ */ 'use strict'; +import type {Console} from 'console'; import type {Config} from 'types/Config'; import type {Global} from 'types/Global'; import type {Script} from 'vm'; @@ -18,15 +19,21 @@ const ModuleMocker = require('jest-mock'); class JSDOMEnvironment { + console: ?Console; document: ?Object; fakeTimers: ?FakeTimers; global: ?Global; moduleMocker: ?ModuleMocker; - constructor(config: Config): void { + constructor(config: Config, + createCustomConsole: (x: number) => Console): void { // lazy require - this.document = require('jsdom').jsdom(/* markup */undefined, { + const jsdom = require('jsdom'); + const console = this.console = createCustomConsole(8); + const virtualConsole = jsdom.createVirtualConsole().sendTo(console); + this.document = jsdom.jsdom(/* markup */undefined, { url: config.testURL, + virtualConsole, }); const global = this.global = this.document.defaultView; // Node's error-message stack size is limited at 10, but it's pretty useful @@ -45,6 +52,7 @@ class JSDOMEnvironment { if (this.global) { this.global.close(); } + this.console = null; this.global = null; this.document = null; this.fakeTimers = null; diff --git a/packages/jest-environment-node/src/index.js b/packages/jest-environment-node/src/index.js index 99f10a87b3c6..d032dd6a4c29 100644 --- a/packages/jest-environment-node/src/index.js +++ b/packages/jest-environment-node/src/index.js @@ -9,6 +9,7 @@ */ 'use strict'; +import type {Console} from 'console'; import type {Config} from 'types/Config'; import type {Global} from 'types/Global'; import type {Script} from 'vm'; @@ -20,14 +21,16 @@ const vm = require('vm'); class NodeEnvironment { + console: ?Console; context: ?vm$Context; fakeTimers: ?FakeTimers; global: ?Global; moduleMocker: ?ModuleMocker; - constructor(config: Config) { + constructor(config: Config, createCustomConsole: (x: number) => Console) { this.context = vm.createContext(); const global = this.global = vm.runInContext('this', this.context); + global.console = this.console = createCustomConsole(4); global.global = global; global.clearInterval = clearInterval; global.clearTimeout = clearTimeout; @@ -43,6 +46,7 @@ class NodeEnvironment { if (this.fakeTimers) { this.fakeTimers.dispose(); } + this.console = null; this.context = null; this.fakeTimers = null; }