diff --git a/lib/jasmine-core/jasmine.js b/lib/jasmine-core/jasmine.js index 6ad75fdc..8dca5bf2 100644 --- a/lib/jasmine-core/jasmine.js +++ b/lib/jasmine-core/jasmine.js @@ -775,10 +775,11 @@ getJasmineRequireObj().Spec = function(j$) { self.onException.apply(self, arguments); }, onComplete: function() { - onComplete( - self.result.status === 'failed' && - new j$.StopExecutionError('spec failed') - ); + if (self.result.status === 'failed') { + onComplete(new j$.StopExecutionError('spec failed')); + } else { + onComplete(); + } }, userContext: this.userContext() }; @@ -7495,6 +7496,12 @@ getJasmineRequireObj().QueueRunner = function(j$) { self.fail(err); } self.errored = errored = true; + } else if (typeof err !== 'undefined' && !self.errored) { + self.deprecated( + 'Any argument passed to a done callback will be treated as an ' + + 'error in a future release. Call the done callback without ' + + "arguments if you don't want to trigger a spec failure." + ); } function runNext() { @@ -7600,7 +7607,12 @@ getJasmineRequireObj().QueueRunner = function(j$) { this.clearStack(function() { self.globalErrors.popListener(self.handleFinalError); - self.onComplete(self.errored && new StopExecutionError()); + + if (self.errored) { + self.onComplete(new StopExecutionError()); + } else { + self.onComplete(); + } }); }; diff --git a/spec/core/QueueRunnerSpec.js b/spec/core/QueueRunnerSpec.js index 8ed3a827..134cfc01 100644 --- a/spec/core/QueueRunnerSpec.js +++ b/spec/core/QueueRunnerSpec.js @@ -149,31 +149,111 @@ describe('QueueRunner', function() { expect(queueableFn2.fn).toHaveBeenCalled(); }); - it('explicitly fails an async function when next is called with an Error and moves to the next function', function() { - var err = new Error('foo'), - queueableFn1 = { - fn: function(done) { - setTimeout(function() { - done(err); - }, 100); - } - }, - queueableFn2 = { fn: jasmine.createSpy('fn2') }, - failFn = jasmine.createSpy('fail'), - queueRunner = new jasmineUnderTest.QueueRunner({ - queueableFns: [queueableFn1, queueableFn2], - fail: failFn + describe('When next is called with an argument', function() { + describe('that is an Error', function() { + it('explicitly fails and moves to the next function', function() { + var err = new Error('foo'), + queueableFn1 = { + fn: function(done) { + setTimeout(function() { + done(err); + }, 100); + } + }, + queueableFn2 = { fn: jasmine.createSpy('fn2') }, + failFn = jasmine.createSpy('fail'), + queueRunner = new jasmineUnderTest.QueueRunner({ + queueableFns: [queueableFn1, queueableFn2], + fail: failFn + }); + + queueRunner.execute(); + + expect(failFn).not.toHaveBeenCalled(); + expect(queueableFn2.fn).not.toHaveBeenCalled(); + + jasmine.clock().tick(100); + + expect(failFn).toHaveBeenCalledWith(err); + expect(queueableFn2.fn).toHaveBeenCalled(); }); - queueRunner.execute(); + it('does not log a deprecation', function() { + var err = new Error('foo'), + queueableFn1 = { + fn: function(done) { + setTimeout(function() { + done(err); + }, 100); + } + }, + deprecated = jasmine.createSpy('deprecated'), + queueRunner = new jasmineUnderTest.QueueRunner({ + queueableFns: [queueableFn1], + deprecated: deprecated + }); - expect(failFn).not.toHaveBeenCalled(); - expect(queueableFn2.fn).not.toHaveBeenCalled(); + queueRunner.execute(); - jasmine.clock().tick(100); + jasmine.clock().tick(100); - expect(failFn).toHaveBeenCalledWith(err); - expect(queueableFn2.fn).toHaveBeenCalled(); + expect(deprecated).not.toHaveBeenCalled(); + }); + }); + + describe('that is not an Error', function() { + it('logs a deprecation', function() { + var queueableFn1 = { + fn: function(done) { + setTimeout(function() { + done('not an Error'); + }, 100); + } + }, + deprecated = jasmine.createSpy('deprecated'), + queueRunner = new jasmineUnderTest.QueueRunner({ + queueableFns: [queueableFn1], + deprecated: deprecated + }); + + queueRunner.execute(); + + jasmine.clock().tick(100); + + expect(deprecated).toHaveBeenCalledWith( + 'Any argument passed to a done callback will be treated as an ' + + 'error in a future release. Call the done callback without ' + + "arguments if you don't want to trigger a spec failure." + ); + }); + + it('moves to the next function without failing', function() { + var queueableFn1 = { + fn: function(done) { + setTimeout(function() { + done('not an Error'); + }, 100); + } + }, + queueableFn2 = { fn: jasmine.createSpy('fn2') }, + failFn = jasmine.createSpy('fail'), + queueRunner = new jasmineUnderTest.QueueRunner({ + queueableFns: [queueableFn1, queueableFn2], + fail: failFn, + deprecated: function() {} + }); + + queueRunner.execute(); + + expect(failFn).not.toHaveBeenCalled(); + expect(queueableFn2.fn).not.toHaveBeenCalled(); + + jasmine.clock().tick(100); + + expect(failFn).not.toHaveBeenCalled(); + expect(queueableFn2.fn).toHaveBeenCalled(); + }); + }); }); it('does not cause an explicit fail if execution is being stopped', function() { @@ -523,8 +603,7 @@ describe('QueueRunner', function() { queueRunner = new jasmineUnderTest.QueueRunner({ queueableFns: [queueableFn], onException: onException - }), - env = jasmineUnderTest.getEnv(); + }); queueRunner.execute(); diff --git a/src/core/QueueRunner.js b/src/core/QueueRunner.js index e811f0b8..ce227108 100644 --- a/src/core/QueueRunner.js +++ b/src/core/QueueRunner.js @@ -105,6 +105,12 @@ getJasmineRequireObj().QueueRunner = function(j$) { self.fail(err); } self.errored = errored = true; + } else if (typeof err !== 'undefined' && !self.errored) { + self.deprecated( + 'Any argument passed to a done callback will be treated as an ' + + 'error in a future release. Call the done callback without ' + + "arguments if you don't want to trigger a spec failure." + ); } function runNext() { @@ -210,7 +216,12 @@ getJasmineRequireObj().QueueRunner = function(j$) { this.clearStack(function() { self.globalErrors.popListener(self.handleFinalError); - self.onComplete(self.errored && new StopExecutionError()); + + if (self.errored) { + self.onComplete(new StopExecutionError()); + } else { + self.onComplete(); + } }); }; diff --git a/src/core/Spec.js b/src/core/Spec.js index 0382dd71..4706a083 100644 --- a/src/core/Spec.js +++ b/src/core/Spec.js @@ -119,10 +119,11 @@ getJasmineRequireObj().Spec = function(j$) { self.onException.apply(self, arguments); }, onComplete: function() { - onComplete( - self.result.status === 'failed' && - new j$.StopExecutionError('spec failed') - ); + if (self.result.status === 'failed') { + onComplete(new j$.StopExecutionError('spec failed')); + } else { + onComplete(); + } }, userContext: this.userContext() };