Parallel: Fixed reporting of exceptions thrown by a describe

This commit is contained in:
Steve Gravrock
2022-09-18 12:10:34 -07:00
parent 735ce6f758
commit 6ada55ff77
7 changed files with 98 additions and 0 deletions

View File

@@ -1637,6 +1637,7 @@ getJasmineRequireObj().Env = function(j$) {
this.parallelReset = function() {
// TODO: ensure that autoCleanClosures was false
suiteBuilder.parallelReset();
runner.parallelReset();
};
/**
@@ -8422,6 +8423,10 @@ getJasmineRequireObj().Runner = function(j$) {
];
}
parallelReset() {
this.executedBefore_ = false;
}
async execute(runablesToRun) {
if (this.executedBefore_) {
this.topSuite_.reset();
@@ -9878,6 +9883,7 @@ getJasmineRequireObj().SuiteBuilder = function(j$) {
parallelReset() {
this.topSuite.removeChildren();
this.topSuite.reset();
this.totalSpecsDefined = 0;
this.focusedRunables = [];
}

View File

@@ -592,6 +592,14 @@ describe('Env', function() {
expect(id).toEqual(env.topSuite().id);
});
});
it('should not reset the topSuite if parallelReset was called since the last run', async function() {
await env.execute();
env.parallelReset();
spyOn(jasmineUnderTest.Suite.prototype, 'reset');
await env.execute();
expect(jasmineUnderTest.Suite.prototype.reset).not.toHaveBeenCalled();
});
});
describe('#spyOnGlobalErrorsAsync', function() {

View File

@@ -177,6 +177,26 @@ describe('SuiteBuilder', function() {
}
describe('#parallelReset', function() {
it('resets the top suite result', function() {
jasmineUnderTest.Suite.prototype.handleException.and.callThrough();
const env = { configuration: () => ({}) };
const suiteBuilder = new jasmineUnderTest.SuiteBuilder({ env });
suiteBuilder.topSuite.handleException(new Error('nope'));
suiteBuilder.parallelReset();
expect(suiteBuilder.topSuite.result).toEqual({
id: suiteBuilder.topSuite.id,
description: 'Jasmine__TopLevel__Suite',
fullName: '',
failedExpectations: [],
deprecationWarnings: [],
duration: null,
properties: null
});
});
it('removes children of the top suite', function() {
const env = { configuration: () => ({}) };
const suiteBuilder = new jasmineUnderTest.SuiteBuilder({ env });

View File

@@ -101,4 +101,62 @@ describe('Support for parallel execution', function() {
jasmine.objectContaining({ overallStatus: 'passed' })
);
});
it('reports errors thrown from describe', async function() {
const reporter = jasmine.createSpyObj('reporter', ['suiteDone']);
env.addReporter(reporter);
env.describe('borken', function() {
throw new Error('nope');
});
await env.execute();
expect(reporter.suiteDone).toHaveBeenCalledWith(
jasmine.objectContaining({
description: 'borken',
status: 'failed',
failedExpectations: [
jasmine.objectContaining({
message: jasmine.stringContaining('Error: nope')
})
]
})
);
// Errors in subsequent suites should also be reported
reporter.suiteDone.calls.reset();
env.parallelReset();
env.describe('zarro boogs', function() {
throw new Error('nor that either');
});
await env.execute();
expect(reporter.suiteDone).toHaveBeenCalledOnceWith(
jasmine.objectContaining({
description: 'zarro boogs',
status: 'failed',
failedExpectations: [
jasmine.objectContaining({
message: jasmine.stringContaining('Error: nor that either')
})
]
})
);
// Failure state should not persist across resets
reporter.suiteDone.calls.reset();
env.parallelReset();
env.describe('actually works', function() {
env.it('a spec', function() {});
});
await env.execute();
expect(reporter.suiteDone).toHaveBeenCalledOnceWith(
jasmine.objectContaining({
description: 'actually works',
status: 'passed',
failedExpectations: []
})
);
});
});

View File

@@ -495,6 +495,7 @@ getJasmineRequireObj().Env = function(j$) {
this.parallelReset = function() {
// TODO: ensure that autoCleanClosures was false
suiteBuilder.parallelReset();
runner.parallelReset();
};
/**

View File

@@ -27,6 +27,10 @@ getJasmineRequireObj().Runner = function(j$) {
];
}
parallelReset() {
this.executedBefore_ = false;
}
async execute(runablesToRun) {
if (this.executedBefore_) {
this.topSuite_.reset();

View File

@@ -24,6 +24,7 @@ getJasmineRequireObj().SuiteBuilder = function(j$) {
parallelReset() {
this.topSuite.removeChildren();
this.topSuite.reset();
this.totalSpecsDefined = 0;
this.focusedRunables = [];
}