diff --git a/lib/jasmine.js b/lib/jasmine.js index ada4cd03..6bc79f93 100644 --- a/lib/jasmine.js +++ b/lib/jasmine.js @@ -1686,9 +1686,6 @@ jasmine.Spec.prototype.finishCallback = function() { }; jasmine.Spec.prototype.finish = function(onComplete) { - for (var i = 0; i < this.afterCallbacks.length; i++) { - this.afterCallbacks[i](); - } this.removeAllSpies(); this.finishCallback(); if (onComplete) { @@ -1696,8 +1693,13 @@ jasmine.Spec.prototype.finish = function(onComplete) { } }; -jasmine.Spec.prototype.after = function(doAfter) { +jasmine.Spec.prototype.after = function(doAfter, test) { + + if (this.queue.isRunning()) { + this.queue.add(new jasmine.Block(this.env, doAfter, this)); + } else { this.afterCallbacks.unshift(doAfter); + } }; jasmine.Spec.prototype.execute = function(onComplete) { @@ -1726,7 +1728,12 @@ jasmine.Spec.prototype.addBeforesAndAftersToQueue = function() { for (var i = 0; i < suite.beforeQueue.length; i++) this.queue.addBefore(new jasmine.Block(this.env, suite.beforeQueue[i], this)); } - if (suite.afterQueue) { + } + for (i = 0; i < this.afterCallbacks.length; i++) { + this.queue.add(new jasmine.Block(this.env, this.afterCallbacks[i], this)); + } + for (suite = this.suite; suite; suite = suite.parentSuite) { + if (suite.afterQueue) { for (var j = 0; j < suite.afterQueue.length; j++) this.queue.add(new jasmine.Block(this.env, suite.afterQueue[j], this)); } diff --git a/spec/suites/SpecRunningTest.js b/spec/suites/SpecRunningTest.js index 101b8735..5a827ebf 100644 --- a/spec/suites/SpecRunningTest.js +++ b/spec/suites/SpecRunningTest.js @@ -675,6 +675,100 @@ describe("jasmine spec running", function () { }); + it("Spec#after should be able to eval runs and waits blocks", function () { + var runsBeforeAfter = false; + var firstSpecHasRun = false; + var secondSpecHasRun = false; + var afterHasRun = false; + var suiteWithAfter = env.describe('one suite with a before', function () { + + env.it('should be the first spec', function () { + firstSpecHasRun = true; + this.after(function () { + this.waits(500); + this.runs(function () { + afterHasRun = true; + }); + this.waits(500); + }, true); + this.waits(500); + this.runs(function () { + runsBeforeAfter = true; + }); + }); + + env.it('should be a spec', function () { + secondSpecHasRun = true; + }); + + }); + + expect(firstSpecHasRun).toEqual(false); + expect(runsBeforeAfter).toEqual(false); + expect(afterHasRun).toEqual(false); + expect(secondSpecHasRun).toEqual(false); + + suiteWithAfter.execute(); + + expect(firstSpecHasRun).toEqual(true); + expect(runsBeforeAfter).toEqual(false); + expect(afterHasRun).toEqual(false); + expect(secondSpecHasRun).toEqual(false); + + fakeTimer.tick(500); + + expect(firstSpecHasRun).toEqual(true); + expect(runsBeforeAfter).toEqual(true); + expect(afterHasRun).toEqual(false); + expect(secondSpecHasRun).toEqual(false); + + fakeTimer.tick(500); + + expect(firstSpecHasRun).toEqual(true); + expect(runsBeforeAfter).toEqual(true); + expect(afterHasRun).toEqual(true); + expect(secondSpecHasRun).toEqual(false); + + fakeTimer.tick(500); + + expect(firstSpecHasRun).toEqual(true); + expect(runsBeforeAfter).toEqual(true); + expect(afterHasRun).toEqual(true); + expect(secondSpecHasRun).toEqual(true); + }); + + it("handles waits", function () { + var firstSpecHasRun = false; + var secondSpecHasRun = false; + var suiteWithAfter = env.describe('one suite with a before', function () { + + env.it('should be the first spec', function () { + this.waits(500); + this.runs(function () { + firstSpecHasRun = true; + }); + }); + + env.it('should be a spec', function () { + secondSpecHasRun = true; + }); + + }); + + expect(firstSpecHasRun).toEqual(false); + expect(secondSpecHasRun).toEqual(false); + + suiteWithAfter.execute(); + + expect(firstSpecHasRun).toEqual(false); + expect(secondSpecHasRun).toEqual(false); + + fakeTimer.tick(500); + + expect(firstSpecHasRun).toEqual(true); + expect(secondSpecHasRun).toEqual(true); +}); + it("testBeforeExecutesSafely", function() { var report = ""; var suite = env.describe('before fails on first test, passes on second', function() { diff --git a/src/Spec.js b/src/Spec.js index cd7e1b75..899b0c6e 100644 --- a/src/Spec.js +++ b/src/Spec.js @@ -97,9 +97,6 @@ jasmine.Spec.prototype.finishCallback = function() { }; jasmine.Spec.prototype.finish = function(onComplete) { - for (var i = 0; i < this.afterCallbacks.length; i++) { - this.afterCallbacks[i](); - } this.removeAllSpies(); this.finishCallback(); if (onComplete) { @@ -107,8 +104,13 @@ jasmine.Spec.prototype.finish = function(onComplete) { } }; -jasmine.Spec.prototype.after = function(doAfter) { +jasmine.Spec.prototype.after = function(doAfter, test) { + + if (this.queue.isRunning()) { + this.queue.add(new jasmine.Block(this.env, doAfter, this)); + } else { this.afterCallbacks.unshift(doAfter); + } }; jasmine.Spec.prototype.execute = function(onComplete) { @@ -137,7 +139,12 @@ jasmine.Spec.prototype.addBeforesAndAftersToQueue = function() { for (var i = 0; i < suite.beforeQueue.length; i++) this.queue.addBefore(new jasmine.Block(this.env, suite.beforeQueue[i], this)); } - if (suite.afterQueue) { + } + for (i = 0; i < this.afterCallbacks.length; i++) { + this.queue.add(new jasmine.Block(this.env, this.afterCallbacks[i], this)); + } + for (suite = this.suite; suite; suite = suite.parentSuite) { + if (suite.afterQueue) { for (var j = 0; j < suite.afterQueue.length; j++) this.queue.add(new jasmine.Block(this.env, suite.afterQueue[j], this)); }