Added the ability to associate trace information with failing specs

This is meant to aid in debugging failures, particularly intermittent
failures, in cases where interactive debugging or console.log aren't
suitable.
This commit is contained in:
Steve Gravrock
2021-09-25 16:07:33 -07:00
parent ef981bb794
commit 7a289f1de7
12 changed files with 447 additions and 7 deletions

View File

@@ -228,7 +228,8 @@ describe('Spec', function() {
deprecationWarnings: [],
pendingReason: '',
duration: jasmine.any(Number),
properties: null
properties: null,
trace: null
},
'things'
);
@@ -516,4 +517,110 @@ describe('Spec', function() {
args.cleanupFns[0].fn();
expect(resultCallback.calls.first().args[0].failedExpectations).toEqual([]);
});
describe('#trace', function() {
it('adds the messages to the result', function() {
var timer = jasmine.createSpyObj('timer', ['start', 'elapsed']),
spec = new jasmineUnderTest.Spec({
queueableFn: {
fn: function() {}
},
queueRunnerFactory: function() {},
timer: timer
}),
t1 = 123,
t2 = 456;
spec.execute();
expect(spec.result.trace).toBeNull();
timer.elapsed.and.returnValue(t1);
spec.trace('msg 1');
expect(spec.result.trace).toEqual([{ message: 'msg 1', timestamp: t1 }]);
timer.elapsed.and.returnValue(t2);
spec.trace('msg 2');
expect(spec.result.trace).toEqual([
{ message: 'msg 1', timestamp: t1 },
{ message: 'msg 2', timestamp: t2 }
]);
});
describe('When the spec passes', function() {
it('omits the messages from the reported result', function() {
var resultCallback = jasmine.createSpy('resultCallback'),
spec = new jasmineUnderTest.Spec({
queueableFn: {
fn: function() {}
},
resultCallback: resultCallback,
queueRunnerFactory: function(config) {
spec.trace('msg');
config.cleanupFns.forEach(function(fn) {
fn.fn();
});
config.onComplete(false);
}
});
spec.execute(function() {});
expect(resultCallback).toHaveBeenCalledWith(
jasmine.objectContaining({ trace: null }),
undefined
);
});
it('removes the messages to save memory', function() {
var resultCallback = jasmine.createSpy('resultCallback'),
spec = new jasmineUnderTest.Spec({
queueableFn: {
fn: function() {}
},
resultCallback: resultCallback,
queueRunnerFactory: function(config) {
spec.trace('msg');
config.cleanupFns.forEach(function(fn) {
fn.fn();
});
config.onComplete(false);
}
});
spec.execute(function() {});
expect(resultCallback).toHaveBeenCalled();
expect(spec.result.trace).toBeNull();
});
});
describe('When the spec fails', function() {
it('includes the messages in the reported result', function() {
var resultCallback = jasmine.createSpy('resultCallback'),
timer = jasmine.createSpyObj('timer', ['start', 'elapsed']),
spec = new jasmineUnderTest.Spec({
queueableFn: {
fn: function() {}
},
resultCallback: resultCallback,
queueRunnerFactory: function(config) {
spec.trace('msg');
spec.onException(new Error('nope'));
config.cleanupFns.forEach(function(fn) {
fn.fn();
});
config.onComplete(true);
},
timer: timer
}),
timestamp = 12345;
timer.elapsed.and.returnValue(timestamp);
spec.execute(function() {});
expect(resultCallback).toHaveBeenCalledWith(
jasmine.objectContaining({
trace: [{ message: 'msg', timestamp: timestamp }]
}),
undefined
);
});
});
});
});