@@ -12,6 +12,7 @@ import type {GlobalConfig, ReporterConfig} from 'types/Config';
1212import type { Context } from 'types/Context' ;
1313import type { Reporter , Test } from 'types/TestRunner' ;
1414
15+ import chalk from 'chalk' ;
1516import { formatExecError } from 'jest-message-util' ;
1617import {
1718 addResult ,
@@ -88,14 +89,33 @@ export default class TestScheduler {
8889 if ( watcher . isInterrupted ( ) ) {
8990 return Promise . resolve ( ) ;
9091 }
92+
9193 if ( testResult . testResults . length === 0 ) {
9294 const message = 'Your test suite must contain at least one test.' ;
93- await onFailure ( test , {
95+
96+ return onFailure ( test , {
9497 message,
9598 stack : new Error ( message ) . stack ,
9699 } ) ;
97- return Promise . resolve ( ) ;
98100 }
101+
102+ // Throws when the context is leaked after executinga test.
103+ if ( testResult . leaks ) {
104+ const message =
105+ chalk . red . bold ( 'EXPERIMENTAL FEATURE!\n' ) +
106+ 'Your test suite is leaking memory. Please ensure all references are cleaned.\n' +
107+ '\n' +
108+ 'There is a number of things that can leak memory:\n' +
109+ ' - Async operations that have not finished (e.g. fs.readFile).\n' +
110+ ' - Timers not properly mocked (e.g. setInterval, setTimeout).\n' +
111+ ' - Keeping references to the global scope.' ;
112+
113+ return onFailure ( test , {
114+ message,
115+ stack : new Error ( message ) . stack ,
116+ } ) ;
117+ }
118+
99119 addResult ( aggregatedResults , testResult ) ;
100120 await this . _dispatcher . onTestResult ( test , testResult , aggregatedResults ) ;
101121 return this . _bailIfNeeded ( contexts , aggregatedResults , watcher ) ;
0 commit comments