Configurable spec/suite filename detection

* Adds extraItStackFrames and extraDescribeStackFrames config properties.
* Un-deprecates the filename properties of reporter events.
* Fixes #2065.
This commit is contained in:
Steve Gravrock
2025-11-01 14:13:51 -07:00
parent fee7e6e64e
commit ff9feb29d3
10 changed files with 251 additions and 42 deletions

View File

@@ -886,12 +886,11 @@ getJasmineRequireObj().Spec = function(j$) {
* @property {String} description - The description passed to the {@link it} that created this spec. * @property {String} description - The description passed to the {@link it} that created this spec.
* @property {String} fullName - The full description including all ancestors of this spec. * @property {String} fullName - The full description including all ancestors of this spec.
* @property {String|null} parentSuiteId - The ID of the suite containing this spec, or null if this spec is not in a describe(). * @property {String|null} parentSuiteId - The ID of the suite containing this spec, or null if this spec is not in a describe().
* @property {String} filename - Deprecated. The name of the file the spec was defined in. * @property {String} filename - The name of the file the spec was defined in.
* Note: The value may be incorrect if zone.js is installed or * Note: The value may be incorrect if zone.js is installed or
* `it`/`fit`/`xit` have been replaced with versions that don't maintain the * `it`/`fit`/`xit` have been replaced with versions that don't maintain the
* same call stack height as the originals. This property may be removed in * same call stack height as the originals. You can fix that by setting
* a future version unless there is enough user interest in keeping it. * {@link Configuration#extraItStackFrames}.
* See {@link https://github.com/jasmine/jasmine/issues/2065}.
* @property {ExpectationResult[]} failedExpectations - The list of expectations that failed during execution of this spec. * @property {ExpectationResult[]} failedExpectations - The list of expectations that failed during execution of this spec.
* @property {ExpectationResult[]} passedExpectations - The list of expectations that passed during execution of this spec. * @property {ExpectationResult[]} passedExpectations - The list of expectations that passed during execution of this spec.
* @property {ExpectationResult[]} deprecationWarnings - The list of deprecation warnings that occurred during execution this spec. * @property {ExpectationResult[]} deprecationWarnings - The list of deprecation warnings that occurred during execution this spec.
@@ -1065,7 +1064,20 @@ getJasmineRequireObj().Spec = function(j$) {
* @returns {Array.<string>} * @returns {Array.<string>}
* @since 5.7.0 * @since 5.7.0
*/ */
getPath: this.getPath.bind(this) getPath: this.getPath.bind(this),
/**
* The name of the file the spec was defined in.
* Note: The value may be incorrect if zone.js is installed or
* `it`/`fit`/`xit` have been replaced with versions that don't maintain the
* same call stack height as the originals. You can fix that by setting
* {@link Configuration#extraItStackFrames}.
* @name Spec#filename
* @readonly
* @type {string}
* @since 5.13.0
*/
filename: this.filename
}; };
} }
@@ -1140,6 +1152,8 @@ getJasmineRequireObj().Order = function() {
}; };
getJasmineRequireObj().Env = function(j$) { getJasmineRequireObj().Env = function(j$) {
const DEFAULT_IT_DESCRIBE_STACK_DEPTH = 3;
/** /**
* @class Env * @class Env
* @since 2.0.0 * @since 2.0.0
@@ -1734,14 +1748,14 @@ getJasmineRequireObj().Env = function(j$) {
this.describe = function(description, definitionFn) { this.describe = function(description, definitionFn) {
ensureIsNotNested('describe'); ensureIsNotNested('describe');
const filename = callerCallerFilename(); const filename = indirectCallerFilename(describeStackDepth());
return suiteBuilder.describe(description, definitionFn, filename) return suiteBuilder.describe(description, definitionFn, filename)
.metadata; .metadata;
}; };
this.xdescribe = function(description, definitionFn) { this.xdescribe = function(description, definitionFn) {
ensureIsNotNested('xdescribe'); ensureIsNotNested('xdescribe');
const filename = callerCallerFilename(); const filename = indirectCallerFilename(describeStackDepth());
return suiteBuilder.xdescribe(description, definitionFn, filename) return suiteBuilder.xdescribe(description, definitionFn, filename)
.metadata; .metadata;
}; };
@@ -1749,30 +1763,38 @@ getJasmineRequireObj().Env = function(j$) {
this.fdescribe = function(description, definitionFn) { this.fdescribe = function(description, definitionFn) {
ensureIsNotNested('fdescribe'); ensureIsNotNested('fdescribe');
ensureNonParallel('fdescribe'); ensureNonParallel('fdescribe');
const filename = callerCallerFilename(); const filename = indirectCallerFilename(describeStackDepth());
return suiteBuilder.fdescribe(description, definitionFn, filename) return suiteBuilder.fdescribe(description, definitionFn, filename)
.metadata; .metadata;
}; };
this.it = function(description, fn, timeout) { this.it = function(description, fn, timeout) {
ensureIsNotNested('it'); ensureIsNotNested('it');
const filename = callerCallerFilename(); const filename = indirectCallerFilename(itStackDepth());
return suiteBuilder.it(description, fn, timeout, filename).metadata; return suiteBuilder.it(description, fn, timeout, filename).metadata;
}; };
this.xit = function(description, fn, timeout) { this.xit = function(description, fn, timeout) {
ensureIsNotNested('xit'); ensureIsNotNested('xit');
const filename = callerCallerFilename(); const filename = indirectCallerFilename(itStackDepth());
return suiteBuilder.xit(description, fn, timeout, filename).metadata; return suiteBuilder.xit(description, fn, timeout, filename).metadata;
}; };
this.fit = function(description, fn, timeout) { this.fit = function(description, fn, timeout) {
ensureIsNotNested('fit'); ensureIsNotNested('fit');
ensureNonParallel('fit'); ensureNonParallel('fit');
const filename = callerCallerFilename(); const filename = indirectCallerFilename(itStackDepth());
return suiteBuilder.fit(description, fn, timeout, filename).metadata; return suiteBuilder.fit(description, fn, timeout, filename).metadata;
}; };
function itStackDepth() {
return DEFAULT_IT_DESCRIBE_STACK_DEPTH + config.extraItStackFrames;
}
function describeStackDepth() {
return DEFAULT_IT_DESCRIBE_STACK_DEPTH + config.extraDescribeStackFrames;
}
/** /**
* Get a user-defined property as part of the properties field of {@link SpecResult} * Get a user-defined property as part of the properties field of {@link SpecResult}
* @name Env#getSpecProperty * @name Env#getSpecProperty
@@ -1958,11 +1980,12 @@ getJasmineRequireObj().Env = function(j$) {
}; };
} }
function callerCallerFilename() { function indirectCallerFilename(depth) {
const frames = new j$.StackTrace(new Error()).frames; const frames = new j$.StackTrace(new Error()).frames;
// frames[3] should always exist except in Jasmine's own tests, which bypass // The specified frame should always exist except in Jasmine's own tests,
// the global it/describe layer, but don't crash if it doesn't. // which bypass the global it/describe layer, but could be absent in case
return frames[3] && frames[3].file; // of misconfiguration. Don't crash if it's absent.
return frames[depth] && frames[depth].file;
} }
return Env; return Env;
@@ -3431,7 +3454,30 @@ getJasmineRequireObj().Configuration = function(j$) {
* @type Boolean * @type Boolean
* @default false * @default false
*/ */
detectLateRejectionHandling: false detectLateRejectionHandling: false,
/**
* The number of extra stack frames inserted by a wrapper around {@link it}
* or by some other local modification. Jasmine uses this to determine the
* filename for {@link SpecStartedEvent} and {@link SpecDoneEvent}.
* @name Configuration#extraItStackFrames
* @since 5.13.0
* @type number
* @default 0
*/
extraItStackFrames: 0,
/**
* The number of extra stack frames inserted by a wrapper around
* {@link describe} or by some other local modification. Jasmine uses this
* to determine the filename for {@link SpecStartedEvent} and
* {@link SpecDoneEvent}.
* @name Configuration#extraDescribeStackFrames
* @since 5.13.0
* @type number
* @default 0
*/
extraDescribeStackFrames: 0
}; };
Object.freeze(defaultConfig); Object.freeze(defaultConfig);
@@ -3487,6 +3533,16 @@ getJasmineRequireObj().Configuration = function(j$) {
if (changes.hasOwnProperty('verboseDeprecations')) { if (changes.hasOwnProperty('verboseDeprecations')) {
this.#values.verboseDeprecations = changes.verboseDeprecations; this.#values.verboseDeprecations = changes.verboseDeprecations;
} }
// 0 is a valid value for both of these, so a truthiness check wouldn't work
if (typeof changes.extraItStackFrames !== 'undefined') {
this.#values.extraItStackFrames = changes.extraItStackFrames;
}
if (typeof changes.extraDescribeStackFrames !== 'undefined') {
this.#values.extraDescribeStackFrames =
changes.extraDescribeStackFrames;
}
} }
} }
@@ -10663,12 +10719,11 @@ getJasmineRequireObj().Suite = function(j$) {
* @property {String} description - The description text passed to the {@link describe} that made this suite. * @property {String} description - The description text passed to the {@link describe} that made this suite.
* @property {String} fullName - The full description including all ancestors of this suite. * @property {String} fullName - The full description including all ancestors of this suite.
* @property {String|null} parentSuiteId - The ID of the suite containing this suite, or null if this is not in another describe(). * @property {String|null} parentSuiteId - The ID of the suite containing this suite, or null if this is not in another describe().
* @property {String} filename - Deprecated. The name of the file the suite was defined in. * @property {String} filename - The name of the file the suite was defined in.
* Note: The value may be incorrect if zone.js is installed or * Note: The value may be incorrect if zone.js is installed or
* `describe`/`fdescribe`/`xdescribe` have been replaced with versions that * `describe`/`fdescribe`/`xdescribe` have been replaced with versions that
* don't maintain the same call stack height as the originals. This property * don't maintain the same call stack height as the originals. You can fix
* may be removed in a future version unless there is enough user interest * that by setting {@link Configuration#extraDescribeStackFrames}.
* in keeping it. See {@link https://github.com/jasmine/jasmine/issues/2065}.
* @property {ExpectationResult[]} failedExpectations - The list of expectations that failed in an {@link afterAll} for this suite. * @property {ExpectationResult[]} failedExpectations - The list of expectations that failed in an {@link afterAll} for this suite.
* @property {ExpectationResult[]} deprecationWarnings - The list of deprecation warnings that occurred on this suite. * @property {ExpectationResult[]} deprecationWarnings - The list of deprecation warnings that occurred on this suite.
* @property {String} status - Once the suite has completed, this string represents the pass/fail status of this suite. * @property {String} status - Once the suite has completed, this string represents the pass/fail status of this suite.
@@ -10875,6 +10930,19 @@ getJasmineRequireObj().Suite = function(j$) {
* @since 2.0.0 * @since 2.0.0
*/ */
this.description = suite.description; this.description = suite.description;
/**
* The name of the file the suite was defined in.
* Note: The value may be incorrect if zone.js is installed or
* `describe`/`fdescribe`/`xdescribe` have been replaced with versions
* that don't maintain the same call stack height as the originals. You
* can fix that by setting {@link Configuration#extraItStackFrames}.
* @name Suite#filename
* @readonly
* @type {string}
* @since 5.13.0
*/
this.filename = suite.filename;
} }
/** /**

View File

@@ -13,7 +13,9 @@ describe('Configuration', function() {
...standardBooleanKeys, ...standardBooleanKeys,
'seed', 'seed',
'specFilter', 'specFilter',
'verboseDeprecations' 'verboseDeprecations',
'extraItStackFrames',
'extraDescribeStackFrames'
]; ];
Object.freeze(standardBooleanKeys); Object.freeze(standardBooleanKeys);
Object.freeze(allKeys); Object.freeze(allKeys);
@@ -32,6 +34,8 @@ describe('Configuration', function() {
expect(subject.forbidDuplicateNames).toEqual(false); expect(subject.forbidDuplicateNames).toEqual(false);
expect(subject.verboseDeprecations).toEqual(false); expect(subject.verboseDeprecations).toEqual(false);
expect(subject.detectLateRejectionHandling).toEqual(false); expect(subject.detectLateRejectionHandling).toEqual(false);
expect(subject.extraItStackFrames).toEqual(0);
expect(subject.extraDescribeStackFrames).toEqual(0);
}); });
describe('copy()', function() { describe('copy()', function() {
@@ -130,5 +134,25 @@ describe('Configuration', function() {
subject.update({ seed: null }); subject.update({ seed: null });
expect(subject.seed).toBeNull(); expect(subject.seed).toBeNull();
}); });
it('sets extraItStackFrames when not undefined', function() {
const subject = new jasmineUnderTest.Configuration();
subject.update({ extraItStackFrames: undefined });
expect(subject.extraItStackFrames).toEqual(0);
subject.update({ extraItStackFrames: 100000 });
expect(subject.extraItStackFrames).toEqual(100000);
});
it('sets extraDescribeStackFrames when not undefined', function() {
const subject = new jasmineUnderTest.Configuration();
subject.update({ extraDescribeStackFrames: undefined });
expect(subject.extraDescribeStackFrames).toEqual(0);
subject.update({ extraDescribeStackFrames: 100000 });
expect(subject.extraDescribeStackFrames).toEqual(100000);
});
}); });
}); });

View File

@@ -95,7 +95,7 @@ describe('Env', function() {
}); });
}); });
it('accepts its own current configureation', function() { it('accepts its own current configuration', function() {
env.configure(env.configuration()); env.configure(env.configuration());
}); });
@@ -198,6 +198,29 @@ describe('Env', function() {
expect(innerSuite.parentSuite).toBe(suite); expect(innerSuite.parentSuite).toBe(suite);
expect(spec.getFullName()).toEqual('outer suite inner suite a spec'); expect(spec.getFullName()).toEqual('outer suite inner suite a spec');
}); });
it('sets the caller filename correctly when extraDescribeStackFrames is not set', function() {
// IIFE is used to match the stack depth when global describe() is called
const suite = (function() {
return env[methodName]('a suite', function() {
env.it('a spec');
});
})();
expect(suite.filename).toMatch(/EnvSpec\.js$/);
});
it('sets the caller filename correctly when extraDescribeStackFrames is set', function() {
env.configure({ extraDescribeStackFrames: 2 });
// IIFE is used to match the stack depth when global describe() is called
const suite = (function() {
return specHelpers.callerFilenameShim(function() {
return env[methodName]('a suite', function() {
env.it('a spec');
});
});
})();
expect(suite.filename).toMatch(/EnvSpec\.js$/);
});
} }
describe('#describe', function() { describe('#describe', function() {
@@ -300,6 +323,25 @@ describe('Env', function() {
.not.toEqual(''); .not.toEqual('');
expect(spec.pend).toBeFalsy(); expect(spec.pend).toBeFalsy();
}); });
it('sets the caller filename correctly when extraItStackFrames is not set', function() {
// IIFE is used to match the stack depth when global it() is called
const spec = (function() {
return env[methodName]('a spec', function() {});
})();
expect(spec.filename).toMatch(/EnvSpec\.js$/);
});
it('sets the caller filename correctly when extraItStackFrames is set', function() {
env.configure({ extraItStackFrames: 2 });
// IIFE is used to match the stack depth when global it() is called
const spec = (function() {
return specHelpers.callerFilenameShim(function() {
return env[methodName]('a spec', function() {});
});
})();
expect(spec.filename).toMatch(/EnvSpec\.js$/);
});
} }
describe('#it', function() { describe('#it', function() {

View File

@@ -0,0 +1,5 @@
(function() {
specHelpers.callerFilenameShim = function(fn) {
return fn();
};
})();

View File

@@ -23,6 +23,7 @@ module.exports = {
'helpers/BrowserFlags.js', 'helpers/BrowserFlags.js',
'helpers/domHelpers.js', 'helpers/domHelpers.js',
'helpers/integrationMatchers.js', 'helpers/integrationMatchers.js',
'helpers/callerFilenameShim.js',
'helpers/defineJasmineUnderTest.js', 'helpers/defineJasmineUnderTest.js',
'helpers/resetEnv.js' 'helpers/resetEnv.js'
], ],

View File

@@ -8,6 +8,7 @@
"helpers/init.js", "helpers/init.js",
"helpers/domHelpers.js", "helpers/domHelpers.js",
"helpers/integrationMatchers.js", "helpers/integrationMatchers.js",
"helpers/callerFilenameShim.js",
"helpers/overrideConsoleLogForCircleCi.js", "helpers/overrideConsoleLogForCircleCi.js",
"helpers/nodeDefineJasmineUnderTest.js", "helpers/nodeDefineJasmineUnderTest.js",
"helpers/resetEnv.js" "helpers/resetEnv.js"

View File

@@ -123,7 +123,30 @@ getJasmineRequireObj().Configuration = function(j$) {
* @type Boolean * @type Boolean
* @default false * @default false
*/ */
detectLateRejectionHandling: false detectLateRejectionHandling: false,
/**
* The number of extra stack frames inserted by a wrapper around {@link it}
* or by some other local modification. Jasmine uses this to determine the
* filename for {@link SpecStartedEvent} and {@link SpecDoneEvent}.
* @name Configuration#extraItStackFrames
* @since 5.13.0
* @type number
* @default 0
*/
extraItStackFrames: 0,
/**
* The number of extra stack frames inserted by a wrapper around
* {@link describe} or by some other local modification. Jasmine uses this
* to determine the filename for {@link SpecStartedEvent} and
* {@link SpecDoneEvent}.
* @name Configuration#extraDescribeStackFrames
* @since 5.13.0
* @type number
* @default 0
*/
extraDescribeStackFrames: 0
}; };
Object.freeze(defaultConfig); Object.freeze(defaultConfig);
@@ -179,6 +202,16 @@ getJasmineRequireObj().Configuration = function(j$) {
if (changes.hasOwnProperty('verboseDeprecations')) { if (changes.hasOwnProperty('verboseDeprecations')) {
this.#values.verboseDeprecations = changes.verboseDeprecations; this.#values.verboseDeprecations = changes.verboseDeprecations;
} }
// 0 is a valid value for both of these, so a truthiness check wouldn't work
if (typeof changes.extraItStackFrames !== 'undefined') {
this.#values.extraItStackFrames = changes.extraItStackFrames;
}
if (typeof changes.extraDescribeStackFrames !== 'undefined') {
this.#values.extraDescribeStackFrames =
changes.extraDescribeStackFrames;
}
} }
} }

View File

@@ -1,4 +1,6 @@
getJasmineRequireObj().Env = function(j$) { getJasmineRequireObj().Env = function(j$) {
const DEFAULT_IT_DESCRIBE_STACK_DEPTH = 3;
/** /**
* @class Env * @class Env
* @since 2.0.0 * @since 2.0.0
@@ -593,14 +595,14 @@ getJasmineRequireObj().Env = function(j$) {
this.describe = function(description, definitionFn) { this.describe = function(description, definitionFn) {
ensureIsNotNested('describe'); ensureIsNotNested('describe');
const filename = callerCallerFilename(); const filename = indirectCallerFilename(describeStackDepth());
return suiteBuilder.describe(description, definitionFn, filename) return suiteBuilder.describe(description, definitionFn, filename)
.metadata; .metadata;
}; };
this.xdescribe = function(description, definitionFn) { this.xdescribe = function(description, definitionFn) {
ensureIsNotNested('xdescribe'); ensureIsNotNested('xdescribe');
const filename = callerCallerFilename(); const filename = indirectCallerFilename(describeStackDepth());
return suiteBuilder.xdescribe(description, definitionFn, filename) return suiteBuilder.xdescribe(description, definitionFn, filename)
.metadata; .metadata;
}; };
@@ -608,30 +610,38 @@ getJasmineRequireObj().Env = function(j$) {
this.fdescribe = function(description, definitionFn) { this.fdescribe = function(description, definitionFn) {
ensureIsNotNested('fdescribe'); ensureIsNotNested('fdescribe');
ensureNonParallel('fdescribe'); ensureNonParallel('fdescribe');
const filename = callerCallerFilename(); const filename = indirectCallerFilename(describeStackDepth());
return suiteBuilder.fdescribe(description, definitionFn, filename) return suiteBuilder.fdescribe(description, definitionFn, filename)
.metadata; .metadata;
}; };
this.it = function(description, fn, timeout) { this.it = function(description, fn, timeout) {
ensureIsNotNested('it'); ensureIsNotNested('it');
const filename = callerCallerFilename(); const filename = indirectCallerFilename(itStackDepth());
return suiteBuilder.it(description, fn, timeout, filename).metadata; return suiteBuilder.it(description, fn, timeout, filename).metadata;
}; };
this.xit = function(description, fn, timeout) { this.xit = function(description, fn, timeout) {
ensureIsNotNested('xit'); ensureIsNotNested('xit');
const filename = callerCallerFilename(); const filename = indirectCallerFilename(itStackDepth());
return suiteBuilder.xit(description, fn, timeout, filename).metadata; return suiteBuilder.xit(description, fn, timeout, filename).metadata;
}; };
this.fit = function(description, fn, timeout) { this.fit = function(description, fn, timeout) {
ensureIsNotNested('fit'); ensureIsNotNested('fit');
ensureNonParallel('fit'); ensureNonParallel('fit');
const filename = callerCallerFilename(); const filename = indirectCallerFilename(itStackDepth());
return suiteBuilder.fit(description, fn, timeout, filename).metadata; return suiteBuilder.fit(description, fn, timeout, filename).metadata;
}; };
function itStackDepth() {
return DEFAULT_IT_DESCRIBE_STACK_DEPTH + config.extraItStackFrames;
}
function describeStackDepth() {
return DEFAULT_IT_DESCRIBE_STACK_DEPTH + config.extraDescribeStackFrames;
}
/** /**
* Get a user-defined property as part of the properties field of {@link SpecResult} * Get a user-defined property as part of the properties field of {@link SpecResult}
* @name Env#getSpecProperty * @name Env#getSpecProperty
@@ -817,11 +827,12 @@ getJasmineRequireObj().Env = function(j$) {
}; };
} }
function callerCallerFilename() { function indirectCallerFilename(depth) {
const frames = new j$.StackTrace(new Error()).frames; const frames = new j$.StackTrace(new Error()).frames;
// frames[3] should always exist except in Jasmine's own tests, which bypass // The specified frame should always exist except in Jasmine's own tests,
// the global it/describe layer, but don't crash if it doesn't. // which bypass the global it/describe layer, but could be absent in case
return frames[3] && frames[3].file; // of misconfiguration. Don't crash if it's absent.
return frames[depth] && frames[depth].file;
} }
return Env; return Env;

View File

@@ -99,12 +99,11 @@ getJasmineRequireObj().Spec = function(j$) {
* @property {String} description - The description passed to the {@link it} that created this spec. * @property {String} description - The description passed to the {@link it} that created this spec.
* @property {String} fullName - The full description including all ancestors of this spec. * @property {String} fullName - The full description including all ancestors of this spec.
* @property {String|null} parentSuiteId - The ID of the suite containing this spec, or null if this spec is not in a describe(). * @property {String|null} parentSuiteId - The ID of the suite containing this spec, or null if this spec is not in a describe().
* @property {String} filename - Deprecated. The name of the file the spec was defined in. * @property {String} filename - The name of the file the spec was defined in.
* Note: The value may be incorrect if zone.js is installed or * Note: The value may be incorrect if zone.js is installed or
* `it`/`fit`/`xit` have been replaced with versions that don't maintain the * `it`/`fit`/`xit` have been replaced with versions that don't maintain the
* same call stack height as the originals. This property may be removed in * same call stack height as the originals. You can fix that by setting
* a future version unless there is enough user interest in keeping it. * {@link Configuration#extraItStackFrames}.
* See {@link https://github.com/jasmine/jasmine/issues/2065}.
* @property {ExpectationResult[]} failedExpectations - The list of expectations that failed during execution of this spec. * @property {ExpectationResult[]} failedExpectations - The list of expectations that failed during execution of this spec.
* @property {ExpectationResult[]} passedExpectations - The list of expectations that passed during execution of this spec. * @property {ExpectationResult[]} passedExpectations - The list of expectations that passed during execution of this spec.
* @property {ExpectationResult[]} deprecationWarnings - The list of deprecation warnings that occurred during execution this spec. * @property {ExpectationResult[]} deprecationWarnings - The list of deprecation warnings that occurred during execution this spec.
@@ -278,7 +277,20 @@ getJasmineRequireObj().Spec = function(j$) {
* @returns {Array.<string>} * @returns {Array.<string>}
* @since 5.7.0 * @since 5.7.0
*/ */
getPath: this.getPath.bind(this) getPath: this.getPath.bind(this),
/**
* The name of the file the spec was defined in.
* Note: The value may be incorrect if zone.js is installed or
* `it`/`fit`/`xit` have been replaced with versions that don't maintain the
* same call stack height as the originals. You can fix that by setting
* {@link Configuration#extraItStackFrames}.
* @name Spec#filename
* @readonly
* @type {string}
* @since 5.13.0
*/
filename: this.filename
}; };
} }

View File

@@ -101,12 +101,11 @@ getJasmineRequireObj().Suite = function(j$) {
* @property {String} description - The description text passed to the {@link describe} that made this suite. * @property {String} description - The description text passed to the {@link describe} that made this suite.
* @property {String} fullName - The full description including all ancestors of this suite. * @property {String} fullName - The full description including all ancestors of this suite.
* @property {String|null} parentSuiteId - The ID of the suite containing this suite, or null if this is not in another describe(). * @property {String|null} parentSuiteId - The ID of the suite containing this suite, or null if this is not in another describe().
* @property {String} filename - Deprecated. The name of the file the suite was defined in. * @property {String} filename - The name of the file the suite was defined in.
* Note: The value may be incorrect if zone.js is installed or * Note: The value may be incorrect if zone.js is installed or
* `describe`/`fdescribe`/`xdescribe` have been replaced with versions that * `describe`/`fdescribe`/`xdescribe` have been replaced with versions that
* don't maintain the same call stack height as the originals. This property * don't maintain the same call stack height as the originals. You can fix
* may be removed in a future version unless there is enough user interest * that by setting {@link Configuration#extraDescribeStackFrames}.
* in keeping it. See {@link https://github.com/jasmine/jasmine/issues/2065}.
* @property {ExpectationResult[]} failedExpectations - The list of expectations that failed in an {@link afterAll} for this suite. * @property {ExpectationResult[]} failedExpectations - The list of expectations that failed in an {@link afterAll} for this suite.
* @property {ExpectationResult[]} deprecationWarnings - The list of deprecation warnings that occurred on this suite. * @property {ExpectationResult[]} deprecationWarnings - The list of deprecation warnings that occurred on this suite.
* @property {String} status - Once the suite has completed, this string represents the pass/fail status of this suite. * @property {String} status - Once the suite has completed, this string represents the pass/fail status of this suite.
@@ -313,6 +312,19 @@ getJasmineRequireObj().Suite = function(j$) {
* @since 2.0.0 * @since 2.0.0
*/ */
this.description = suite.description; this.description = suite.description;
/**
* The name of the file the suite was defined in.
* Note: The value may be incorrect if zone.js is installed or
* `describe`/`fdescribe`/`xdescribe` have been replaced with versions
* that don't maintain the same call stack height as the originals. You
* can fix that by setting {@link Configuration#extraItStackFrames}.
* @name Suite#filename
* @readonly
* @type {string}
* @since 5.13.0
*/
this.filename = suite.filename;
} }
/** /**