Revert "Revert "Added the ability to associate trace information with failing specs""

This reverts commit fdad8849df.
This commit is contained in:
Steve Gravrock
2021-10-02 09:56:25 -07:00
parent 9c03d4d3e9
commit 47081258cd
12 changed files with 447 additions and 7 deletions

View File

@@ -436,9 +436,53 @@ jasmineRequire.HtmlReporter = function(j$) {
);
}
if (result.trace) {
messages.appendChild(traceTable(result.trace));
}
return failure;
}
function traceTable(trace) {
var tbody = createDom('tbody');
trace.forEach(function(entry) {
tbody.appendChild(
createDom(
'tr',
{},
createDom('td', {}, entry.timestamp.toString()),
createDom('td', {}, entry.message)
)
);
});
return createDom(
'div',
{ className: 'jasmine-trace' },
createDom(
'div',
{ className: 'jasmine-trace-header' },
'Trace information'
),
createDom(
'table',
{},
createDom(
'thead',
{},
createDom(
'tr',
{},
createDom('th', {}, 'Time (ms)'),
createDom('th', {}, 'Message')
)
),
tbody
)
);
}
function summaryList(resultsTree, domParent) {
var specListNode;
for (var i = 0; i < resultsTree.children.length; i++) {

View File

@@ -287,4 +287,17 @@ body {
display: block;
margin-left: 14px;
padding: 5px;
}
.jasmine_html-reporter .jasmine-trace {
margin: 5px 0 0 0;
padding: 5px;
color: #666;
border: 1px solid #ddd;
background: white;
}
.jasmine_html-reporter .jasmine-trace table {
border-spacing: 0;
}
.jasmine_html-reporter .jasmine-trace table, .jasmine_html-reporter .jasmine-trace th, .jasmine_html-reporter .jasmine-trace td {
border: 1px solid #ddd;
}

View File

@@ -559,6 +559,22 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
putativeSpy.calls instanceof j$.CallTracker
);
};
/**
* Logs a message for use in debugging. If the spec fails, trace messages
* will be included in the {@link SpecResult|result} passed to the
* reporter's specDone method.
*
* This method should be called only when a spec (including any associated
* beforeEach or afterEach functions) is running.
* @function
* @name jasmine.trace
* @since 3.10.0
* @param {String} msg - The message to log
*/
j$.trace = function(msg) {
j$.getEnv().trace(msg);
};
};
getJasmineRequireObj().util = function(j$) {
@@ -779,8 +795,9 @@ getJasmineRequireObj().Spec = function(j$) {
* @property {String} status - Once the spec has completed, this string represents the pass/fail status of this spec.
* @property {number} duration - The time in ms used by the spec execution, including any before/afterEach.
* @property {Object} properties - User-supplied properties, if any, that were set using {@link Env#setSpecProperty}
* @property {TraceEntry[]|null} trace - Trace messages, if any, that were logged using {@link Env#trace} during a failing spec.
* @since 2.0.0
x */
*/
this.result = {
id: this.id,
description: this.description,
@@ -790,7 +807,8 @@ x */
deprecationWarnings: [],
pendingReason: '',
duration: null,
properties: null
properties: null,
trace: null
};
}
@@ -835,6 +853,11 @@ x */
self.queueableFn.fn = null;
self.result.status = self.status(excluded, failSpecWithNoExp);
self.result.duration = self.timer.elapsed();
if (self.result.status !== 'failed') {
self.result.trace = null;
}
self.resultCallback(self.result, done);
}
};
@@ -961,6 +984,20 @@ x */
);
};
Spec.prototype.trace = function(msg) {
if (!this.result.trace) {
this.result.trace = [];
}
/**
* @typedef TraceEntry
* @property {String} message - The message that was passed to {@link Env#trace}.
* @property {number} timestamp - The time when the entry was added, in
* milliseconds from the spec's start time
*/
this.result.trace.push({ message: msg, timestamp: this.timer.elapsed() });
};
var extractCustomPendingMessage = function(e) {
var fullMessage = e.toString(),
boilerplateStart = fullMessage.indexOf(Spec.pendingSpecExceptionMessage),
@@ -2217,6 +2254,16 @@ getJasmineRequireObj().Env = function(j$) {
currentSuite().setSuiteProperty(key, value);
};
this.trace = function(msg) {
var maybeSpec = currentRunnable();
if (!maybeSpec || !maybeSpec.trace) {
throw new Error("'trace' was called when there was no current spec");
}
maybeSpec.trace(msg);
};
this.expect = function(actual) {
if (!currentRunnable()) {
throw new Error(