Report the ID of each suite/spec's parent
This is intended to support parallel execution, which is planned for a future release of Jasmine. Because the execution of unrelated suites will interleave when run in parallel, reporters will not be able to assume that the most recent `suiteStarted` event identifies the parent of the current suite/spec. By adding this feature now, we allow reporters to support both parallel execution and at least some 4.x versions without having to implement two different ways of finding the parent suite.
This commit is contained in:
@@ -1933,11 +1933,17 @@ describe('Env integration', function() {
|
||||
'specStarted',
|
||||
'specDone'
|
||||
]);
|
||||
const suiteFullNameToId = {};
|
||||
reporter.suiteStarted.and.callFake(function(e) {
|
||||
suiteFullNameToId[e.fullName] = e.id;
|
||||
});
|
||||
|
||||
env.addReporter(reporter);
|
||||
|
||||
env.it('a top level spec', function() {});
|
||||
|
||||
env.describe('A Suite', function() {
|
||||
env.it('with a top level spec', function() {
|
||||
env.it('with a spec', function() {
|
||||
env.expect(true).toBe(true);
|
||||
});
|
||||
env.describe('with a nested suite', function() {
|
||||
@@ -1960,37 +1966,109 @@ describe('Env integration', function() {
|
||||
await env.execute();
|
||||
|
||||
expect(reporter.jasmineStarted).toHaveBeenCalledWith({
|
||||
totalSpecsDefined: 5,
|
||||
totalSpecsDefined: 6,
|
||||
order: jasmine.any(jasmineUnderTest.Order)
|
||||
});
|
||||
|
||||
expect(reporter.specDone.calls.count()).toBe(5);
|
||||
expect(reporter.specStarted.calls.count()).toBe(6);
|
||||
expect(reporter.specDone.calls.count()).toBe(6);
|
||||
|
||||
expect(reporter.specDone).toHaveBeenCalledWith(
|
||||
expect(reporter.specStarted).toHaveBeenCalledWith(
|
||||
jasmine.objectContaining({
|
||||
description: 'with a top level spec',
|
||||
status: 'passed'
|
||||
description: 'a top level spec',
|
||||
parentSuiteId: null
|
||||
})
|
||||
);
|
||||
|
||||
expect(reporter.specDone).toHaveBeenCalledWith(
|
||||
jasmine.objectContaining({
|
||||
description: "with an x'ed spec",
|
||||
status: 'pending'
|
||||
description: 'a top level spec',
|
||||
status: 'passed',
|
||||
parentSuiteId: null
|
||||
})
|
||||
);
|
||||
expect(reporter.specStarted).toHaveBeenCalledWith(
|
||||
jasmine.objectContaining({
|
||||
description: 'with a spec',
|
||||
parentSuiteId: suiteFullNameToId['A Suite']
|
||||
})
|
||||
);
|
||||
|
||||
expect(reporter.specDone).toHaveBeenCalledWith(
|
||||
jasmine.objectContaining({
|
||||
description: 'with a spec',
|
||||
status: 'failed'
|
||||
status: 'passed',
|
||||
parentSuiteId: suiteFullNameToId['A Suite']
|
||||
})
|
||||
);
|
||||
|
||||
expect(reporter.specStarted).toHaveBeenCalledWith(
|
||||
jasmine.objectContaining({
|
||||
description: "with an x'ed spec",
|
||||
parentSuiteId: suiteFullNameToId['A Suite with a nested suite']
|
||||
})
|
||||
);
|
||||
expect(reporter.specDone).toHaveBeenCalledWith(
|
||||
jasmine.objectContaining({
|
||||
description: "with an x'ed spec",
|
||||
status: 'pending',
|
||||
parentSuiteId: suiteFullNameToId['A Suite with a nested suite']
|
||||
})
|
||||
);
|
||||
|
||||
expect(reporter.specStarted).toHaveBeenCalledWith(
|
||||
jasmine.objectContaining({
|
||||
description: 'with a spec',
|
||||
parentSuiteId: suiteFullNameToId['A Suite with a nested suite']
|
||||
})
|
||||
);
|
||||
expect(reporter.specDone).toHaveBeenCalledWith(
|
||||
jasmine.objectContaining({
|
||||
description: 'with a spec',
|
||||
status: 'failed',
|
||||
parentSuiteId: suiteFullNameToId['A Suite with a nested suite']
|
||||
})
|
||||
);
|
||||
|
||||
expect(reporter.specStarted).toHaveBeenCalledWith(
|
||||
jasmine.objectContaining({
|
||||
description: 'is pending',
|
||||
parentSuiteId:
|
||||
suiteFullNameToId['A Suite with only non-executable specs']
|
||||
})
|
||||
);
|
||||
expect(reporter.specDone).toHaveBeenCalledWith(
|
||||
jasmine.objectContaining({
|
||||
description: 'is pending',
|
||||
status: 'pending'
|
||||
status: 'pending',
|
||||
parentSuiteId:
|
||||
suiteFullNameToId['A Suite with only non-executable specs']
|
||||
})
|
||||
);
|
||||
|
||||
expect(reporter.suiteStarted).toHaveBeenCalledWith(
|
||||
jasmine.objectContaining({
|
||||
description: 'A Suite',
|
||||
parentSuiteId: null
|
||||
})
|
||||
);
|
||||
expect(reporter.suiteDone).toHaveBeenCalledWith(
|
||||
jasmine.objectContaining({
|
||||
description: 'A Suite',
|
||||
status: 'passed',
|
||||
parentSuiteId: null
|
||||
})
|
||||
);
|
||||
|
||||
expect(reporter.suiteStarted).toHaveBeenCalledWith(
|
||||
jasmine.objectContaining({
|
||||
description: 'with a nested suite',
|
||||
parentSuiteId: suiteFullNameToId['A Suite']
|
||||
})
|
||||
);
|
||||
expect(reporter.suiteDone).toHaveBeenCalledWith(
|
||||
jasmine.objectContaining({
|
||||
description: 'with a nested suite',
|
||||
status: 'passed',
|
||||
parentSuiteId: suiteFullNameToId['A Suite']
|
||||
})
|
||||
);
|
||||
|
||||
@@ -2001,6 +2079,89 @@ describe('Env integration', function() {
|
||||
expect(suiteResult.description).toEqual('A Suite');
|
||||
});
|
||||
|
||||
it('reports focused specs and suites as expected', async function() {
|
||||
const reporter = jasmine.createSpyObj('fakeReporter', [
|
||||
'suiteStarted',
|
||||
'suiteDone',
|
||||
'specStarted',
|
||||
'specDone'
|
||||
]);
|
||||
const suiteFullNameToId = {};
|
||||
reporter.suiteStarted.and.callFake(function(e) {
|
||||
suiteFullNameToId[e.fullName] = e.id;
|
||||
});
|
||||
|
||||
env.fit('a focused top level spec', function() {});
|
||||
|
||||
env.describe('a suite', function() {
|
||||
env.fdescribe('a focused suite', function() {
|
||||
env.fit('a focused spec', function() {});
|
||||
});
|
||||
});
|
||||
|
||||
env.addReporter(reporter);
|
||||
await env.execute();
|
||||
|
||||
expect(reporter.specStarted).toHaveBeenCalledTimes(2);
|
||||
expect(reporter.specDone).toHaveBeenCalledTimes(2);
|
||||
|
||||
expect(reporter.specStarted).toHaveBeenCalledWith(
|
||||
jasmine.objectContaining({
|
||||
description: 'a focused top level spec',
|
||||
parentSuiteId: null
|
||||
})
|
||||
);
|
||||
expect(reporter.specDone).toHaveBeenCalledWith(
|
||||
jasmine.objectContaining({
|
||||
description: 'a focused top level spec',
|
||||
status: 'passed',
|
||||
parentSuiteId: null
|
||||
})
|
||||
);
|
||||
|
||||
expect(reporter.specStarted).toHaveBeenCalledWith(
|
||||
jasmine.objectContaining({
|
||||
description: 'a focused spec',
|
||||
parentSuiteId: suiteFullNameToId['a suite a focused suite']
|
||||
})
|
||||
);
|
||||
expect(reporter.specDone).toHaveBeenCalledWith(
|
||||
jasmine.objectContaining({
|
||||
description: 'a focused spec',
|
||||
status: 'passed',
|
||||
parentSuiteId: suiteFullNameToId['a suite a focused suite']
|
||||
})
|
||||
);
|
||||
|
||||
expect(reporter.suiteStarted).toHaveBeenCalledWith(
|
||||
jasmine.objectContaining({
|
||||
description: 'a suite',
|
||||
parentSuiteId: null
|
||||
})
|
||||
);
|
||||
expect(reporter.suiteDone).toHaveBeenCalledWith(
|
||||
jasmine.objectContaining({
|
||||
description: 'a suite',
|
||||
status: 'passed',
|
||||
parentSuiteId: null
|
||||
})
|
||||
);
|
||||
|
||||
expect(reporter.suiteStarted).toHaveBeenCalledWith(
|
||||
jasmine.objectContaining({
|
||||
description: 'a focused suite',
|
||||
parentSuiteId: suiteFullNameToId['a suite']
|
||||
})
|
||||
);
|
||||
expect(reporter.suiteDone).toHaveBeenCalledWith(
|
||||
jasmine.objectContaining({
|
||||
description: 'a focused suite',
|
||||
status: 'passed',
|
||||
parentSuiteId: suiteFullNameToId['a suite']
|
||||
})
|
||||
);
|
||||
});
|
||||
|
||||
it('should report the random seed at the beginning and end of execution', async function() {
|
||||
const reporter = jasmine.createSpyObj('fakeReporter', [
|
||||
'jasmineStarted',
|
||||
|
||||
Reference in New Issue
Block a user