Skip to content

Commit 8a50998

Browse files
committed
Add Async Test Environment APIs
1 parent 95278b2 commit 8a50998

File tree

8 files changed

+81
-31
lines changed

8 files changed

+81
-31
lines changed

integration_tests/__tests__/test_environment.test.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,9 @@ const runJest = require('../runJest');
1414
const testFixturePackage = require('../test-environment/package.json');
1515

1616
it('respects testEnvironment docblock', () => {
17-
expect(testFixturePackage.jest.testEnvironment).toEqual('node');
17+
expect(testFixturePackage.jest.testEnvironment).toEqual('./test-environment');
1818

19-
const result = runJest.json('test-environment').json;
19+
const result = runJest('test-environment');
2020

21-
expect(result.success).toBe(true);
22-
expect(result.numTotalTests).toBe(1);
21+
expect(result.stdout).toBe('teardown\n');
2322
});

integration_tests/test-environment/__tests__/env.test.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* LICENSE file in the root directory of this source tree. An additional grant
66
* of patent rights can be found in the PATENTS file in the same directory.
77
*
8-
* @jest-environment jsdom
8+
* @jest-environment ./test-environment
99
*/
1010
'use strict';
1111
/* eslint-env browser*/
@@ -14,3 +14,7 @@ test('stub', () => {
1414
const element = document.createElement('div');
1515
expect(element).not.toBeNull();
1616
});
17+
18+
test('stub2', () => {
19+
expect(global.setup).toBe('setup');
20+
});
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
22
"jest": {
3-
"testEnvironment": "node"
3+
"testEnvironment": "./test-environment"
44
}
55
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
const JSDOMEnvironment = require('../../packages/jest-environment-jsdom');
2+
3+
class TestEnvironment extends JSDOMEnvironment {
4+
constructor(config) {
5+
super(config);
6+
}
7+
8+
async setup() {
9+
this.global.setup = 'setup';
10+
}
11+
12+
async teardown() {
13+
console.log('teardown');
14+
}
15+
16+
dispose() {
17+
super.dispose();
18+
}
19+
20+
runScript(script) {
21+
return super.runScript(script);
22+
}
23+
}
24+
25+
module.exports = TestEnvironment;

packages/jest-environment-jsdom/src/index.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,14 @@ class JSDOMEnvironment {
3737
this.fakeTimers = new FakeTimers(global, this.moduleMocker, config);
3838
}
3939

40+
setup(): Promise<void> {
41+
return Promise.resolve();
42+
}
43+
44+
teardown(): Promise<void> {
45+
return Promise.resolve();
46+
}
47+
4048
dispose(): void {
4149
if (this.fakeTimers) {
4250
this.fakeTimers.dispose();

packages/jest-environment-node/src/index.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,14 @@ class NodeEnvironment {
3737
this.fakeTimers = new FakeTimers(global, this.moduleMocker, config);
3838
}
3939

40+
setup(): Promise<void> {
41+
return Promise.resolve();
42+
}
43+
44+
teardown(): Promise<void> {
45+
return Promise.resolve();
46+
}
47+
4048
dispose() {
4149
if (this.fakeTimers) {
4250
this.fakeTimers.dispose();

packages/jest-runner/src/run_test.js

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import type {EnvironmentClass} from 'types/Environment';
1212
import type {GlobalConfig, Path, ProjectConfig} from 'types/Config';
1313
import type {Resolver} from 'types/Resolve';
1414
import type {TestFramework} from 'types/TestRunner';
15-
import type {TestResult} from 'types/TestResult';
1615
import type RuntimeClass from 'jest-runtime';
1716

1817
import fs from 'fs';
@@ -100,8 +99,15 @@ export default function runTest(
10099
mapCoverage: globalConfig.mapCoverage,
101100
});
102101
const start = Date.now();
103-
return testFramework(globalConfig, config, environment, runtime, path)
104-
.then((result: TestResult) => {
102+
return environment.setup().then(async () => {
103+
try {
104+
const result = await testFramework(
105+
globalConfig,
106+
config,
107+
environment,
108+
runtime,
109+
path,
110+
);
105111
const testCount =
106112
result.numPassingTests +
107113
result.numFailingTests +
@@ -113,26 +119,24 @@ export default function runTest(
113119
result.console = testConsole.getBuffer();
114120
result.skipped = testCount === result.numPendingTests;
115121
result.displayName = config.displayName;
116-
return result;
117-
})
118-
.then(
119-
result =>
120-
Promise.resolve().then(() => {
121-
environment.dispose();
122-
if (globalConfig.logHeapUsage) {
123-
if (global.gc) {
124-
global.gc();
125-
}
126-
result.memoryUsage = process.memoryUsage().heapUsed;
127-
}
128-
129-
// Delay the resolution to allow log messages to be output.
130-
return new Promise(resolve => setImmediate(() => resolve(result)));
131-
}),
132-
err =>
133-
Promise.resolve().then(() => {
134-
environment.dispose();
135-
throw err;
136-
}),
137-
);
122+
if (environment.teardown) {
123+
await environment.teardown();
124+
}
125+
environment.dispose();
126+
if (globalConfig.logHeapUsage) {
127+
if (global.gc) {
128+
global.gc();
129+
}
130+
result.memoryUsage = process.memoryUsage().heapUsed;
131+
}
132+
// Delay the resolution to allow log messages to be output.
133+
return new Promise(resolve => setImmediate(() => resolve(result)));
134+
} catch (err) {
135+
if (environment.teardown) {
136+
await environment.teardown();
137+
}
138+
environment.dispose();
139+
throw err;
140+
}
141+
});
138142
}

types/Environment.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ declare class $JestEnvironment {
3131
},
3232
testFilePath: string,
3333
moduleMocker: ModuleMocker,
34+
setup(): Promise<void>,
35+
teardown(): Promise<void>,
3436
}
3537

3638
export type Environment = $JestEnvironment;

0 commit comments

Comments
 (0)