From aabf8cec8246ed4fa63d55ec8d044d702c74cc73 Mon Sep 17 00:00:00 2001 From: Sheel Choksi Date: Mon, 8 Jul 2013 23:00:42 -0700 Subject: [PATCH] Specs/Suites wait for an async spec to finish Go back to having all suites and specs run asynchronously so that they properly wait for any async specs that there might be --- lib/jasmine-core/jasmine.js | 13 +++++-------- spec/core/EnvSpec.js | 24 ++++++++++++++++++++++++ spec/core/QueueRunnerSpec.js | 2 +- src/core/QueueRunner.js | 7 ++----- src/core/Suite.js | 6 +++--- 5 files changed, 35 insertions(+), 17 deletions(-) diff --git a/lib/jasmine-core/jasmine.js b/lib/jasmine-core/jasmine.js index ae5618a0..32363b08 100644 --- a/lib/jasmine-core/jasmine.js +++ b/lib/jasmine-core/jasmine.js @@ -1323,13 +1323,10 @@ getJasmineRequireObj().QueueRunner = function() { } } - var runnerDone = iterativeIndex >= length, - hasBeenAsyncSpec = recursiveIndex > 0; + var runnerDone = iterativeIndex >= length; - if (runnerDone && hasBeenAsyncSpec) { + if (runnerDone) { this.clearStack(this.onComplete); - } else if(runnerDone) { - this.onComplete(); } function attempt(fn) { @@ -1550,7 +1547,7 @@ getJasmineRequireObj().Suite = function() { children = this.children_; for (var i = 0; i < children.length; i++) { - allFns.push(wrapChild(children[i])); + allFns.push(wrapChildAsAsync(children[i])); } this.onStart(this); @@ -1568,8 +1565,8 @@ getJasmineRequireObj().Suite = function() { } } - function wrapChild(child) { - return function() { child.execute(); }; + function wrapChildAsAsync(child) { + return function(done) { child.execute(done); }; } }; diff --git a/spec/core/EnvSpec.js b/spec/core/EnvSpec.js index db221c4c..f88d8ca6 100644 --- a/spec/core/EnvSpec.js +++ b/spec/core/EnvSpec.js @@ -189,6 +189,30 @@ describe("Env integration", function() { env.execute(); }); + it("should run async specs in order, waiting for them to complete", function(done) { + var env = new j$.Env(), mutatedVar; + + env.describe("tests", function() { + env.beforeEach(function() { + mutatedVar = 2; + }); + + env.it("async spec", function(underTestCallback) { + setTimeout(function() { + expect(mutatedVar).toEqual(2); + underTestCallback(); + done(); + }, 0); + }); + + env.it("after async spec", function() { + mutatedVar = 3; + }); + }); + + env.execute(); + }); + // TODO: something is wrong with this spec it("should report as expected", function(done) { var env = new j$.Env(), diff --git a/spec/core/QueueRunnerSpec.js b/spec/core/QueueRunnerSpec.js index e6edf96b..bdf7c202 100644 --- a/spec/core/QueueRunnerSpec.js +++ b/spec/core/QueueRunnerSpec.js @@ -127,7 +127,7 @@ describe("QueueRunner", function() { expect(completeCallback).toHaveBeenCalled(); }); - it("with an async spec, calls a provided stack clearing function when done", function() { + it("calls a provided stack clearing function when done", function() { var asyncFn = function(done) { done() }, afterFn = jasmine.createSpy('afterFn'), completeCallback = jasmine.createSpy('completeCallback'), diff --git a/src/core/QueueRunner.js b/src/core/QueueRunner.js index 85dfea3c..ac615053 100644 --- a/src/core/QueueRunner.js +++ b/src/core/QueueRunner.js @@ -32,13 +32,10 @@ getJasmineRequireObj().QueueRunner = function() { } } - var runnerDone = iterativeIndex >= length, - hasBeenAsyncSpec = recursiveIndex > 0; + var runnerDone = iterativeIndex >= length; - if (runnerDone && hasBeenAsyncSpec) { + if (runnerDone) { this.clearStack(this.onComplete); - } else if(runnerDone) { - this.onComplete(); } function attempt(fn) { diff --git a/src/core/Suite.js b/src/core/Suite.js index 5d080d6c..c586551d 100644 --- a/src/core/Suite.js +++ b/src/core/Suite.js @@ -74,7 +74,7 @@ getJasmineRequireObj().Suite = function() { children = this.children_; for (var i = 0; i < children.length; i++) { - allFns.push(wrapChild(children[i])); + allFns.push(wrapChildAsAsync(children[i])); } this.onStart(this); @@ -92,8 +92,8 @@ getJasmineRequireObj().Suite = function() { } } - function wrapChild(child) { - return function() { child.execute(); }; + function wrapChildAsAsync(child) { + return function(done) { child.execute(done); }; } };