Parallel: forbid beforeEach/afterEach at the top level of spec files

Each spec file is only loaded in a single worker, so top level
before/afterEach can't behave consistently.

beforeEach/afterEach are still supported in:
* Helper files
* describe() blocks
* At the top level of spec files in non-parallel mode
This commit is contained in:
Steve Gravrock
2022-10-11 19:23:48 -07:00
parent 394068f863
commit 1e7b68236b
4 changed files with 86 additions and 0 deletions

View File

@@ -1188,6 +1188,7 @@ getJasmineRequireObj().Env = function(j$) {
let reporter;
let topSuite;
let runner;
let parallelLodingState = null; // 'specs', 'helpers', or null for non-parallel
/**
* This represents the available options to configure Jasmine.
@@ -1634,6 +1635,10 @@ getJasmineRequireObj().Env = function(j$) {
reportSpecDone
});
this.setParallelLoadingState = function(state) {
parallelLodingState = state;
};
this.parallelReset = function() {
// TODO: ensure that autoCleanClosures was false
suiteBuilder.parallelReset();
@@ -1801,6 +1806,16 @@ getJasmineRequireObj().Env = function(j$) {
}
}
function ensureNonParallelOrInHelperOrInDescribe(method) {
if (parallelLodingState === 'specs' && !suiteBuilder.inDescribe()) {
throw new Error(
'In parallel mode, ' +
method +
' must be in a describe block or in a helper file'
);
}
}
this.describe = function(description, definitionFn) {
ensureIsNotNested('describe');
return suiteBuilder.describe(description, definitionFn).metadata;
@@ -1922,6 +1937,7 @@ getJasmineRequireObj().Env = function(j$) {
this.beforeEach = function(beforeEachFunction, timeout) {
ensureIsNotNested('beforeEach');
ensureNonParallelOrInHelperOrInDescribe('beforeEach');
suiteBuilder.beforeEach(beforeEachFunction, timeout);
};
@@ -1932,6 +1948,7 @@ getJasmineRequireObj().Env = function(j$) {
this.afterEach = function(afterEachFunction, timeout) {
ensureIsNotNested('afterEach');
ensureNonParallelOrInHelperOrInDescribe('afterEach');
suiteBuilder.afterEach(afterEachFunction, timeout);
};
@@ -9876,6 +9893,10 @@ getJasmineRequireObj().SuiteBuilder = function(j$) {
this.focusedRunables = [];
}
inDescribe() {
return this.currentDeclarationSuite_ !== this.topSuite;
}
parallelReset() {
this.topSuite.removeChildren();
this.topSuite.reset();