diff --git a/lib/jasmine-core/boot.js b/lib/jasmine-core/boot.js index cf93dda2..1d6820dc 100644 --- a/lib/jasmine-core/boot.js +++ b/lib/jasmine-core/boot.js @@ -79,6 +79,14 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. return env.afterEach(afterEachFunction); }, + beforeAll: function(beforeAllFunction) { + return env.beforeAll(beforeAllFunction); + }, + + afterAll: function(afterAllFunction) { + return env.afterAll(afterAllFunction); + }, + expect: function(actual) { return env.expect(actual); }, diff --git a/lib/jasmine-core/boot/boot.js b/lib/jasmine-core/boot/boot.js index ec8baa0a..32bfb076 100644 --- a/lib/jasmine-core/boot/boot.js +++ b/lib/jasmine-core/boot/boot.js @@ -57,6 +57,14 @@ return env.afterEach(afterEachFunction); }, + beforeAll: function(beforeAllFunction) { + return env.beforeAll(beforeAllFunction); + }, + + afterAll: function(afterAllFunction) { + return env.afterAll(afterAllFunction); + }, + expect: function(actual) { return env.expect(actual); }, diff --git a/lib/jasmine-core/jasmine.js b/lib/jasmine-core/jasmine.js index a86f54f6..27ccdcf9 100644 --- a/lib/jasmine-core/jasmine.js +++ b/lib/jasmine-core/jasmine.js @@ -599,6 +599,7 @@ getJasmineRequireObj().Env = function(j$) { parentSuite: currentDeclarationSuite, queueRunner: queueRunnerFactory, onStart: suiteStarted, + expectationFactory: expectationFactory, resultCallback: function(attrs) { if (!suite.disabled) { clearResourcesForRunnable(suite.id); @@ -704,7 +705,7 @@ getJasmineRequireObj().Env = function(j$) { }; this.expect = function(actual) { - return currentSpec.expect(actual); + return currentRunnable().expect(actual); }; this.beforeEach = function(beforeEachFunction) { @@ -1795,6 +1796,7 @@ getJasmineRequireObj().Suite = function() { this.onStart = attrs.onStart || function() {}; this.resultCallback = attrs.resultCallback || function() {}; this.clearStack = attrs.clearStack || function(fn) {fn();}; + this.expectationFactory = attrs.expectationFactory; this.beforeFns = []; this.afterFns = []; @@ -1813,6 +1815,10 @@ getJasmineRequireObj().Suite = function() { }; } + Suite.prototype.expect = function(actual) { + return this.expectationFactory(actual, this); + }; + Suite.prototype.getFullName = function() { var fullName = this.description; for (var parentSuite = this.parentSuite; parentSuite; parentSuite = parentSuite.parentSuite) { @@ -1918,6 +1924,13 @@ getJasmineRequireObj().Suite = function() { } }; + Suite.prototype.addExpectationResult = function () { + for (var i = 0; i < this.children.length; i++) { + var child = this.children[i]; + child.addExpectationResult.apply(child, arguments); + } + }; + function clone(obj) { var clonedObj = {}; for (var prop in obj) { diff --git a/spec/core/integration/EnvSpec.js b/spec/core/integration/EnvSpec.js index a824db22..6f8e0dbb 100644 --- a/spec/core/integration/EnvSpec.js +++ b/spec/core/integration/EnvSpec.js @@ -290,6 +290,44 @@ describe("Env integration", function() { env.execute(); }); + it("fails all underlying specs when the beforeAll fails", function (done) { + var env = new j$.Env(), + reporter = jasmine.createSpyObj('fakeReporter', [ "specDone", "jasmineDone" ]); + + reporter.jasmineDone.and.callFake(function() { + expect(reporter.specDone.calls.count()).toEqual(2); + + expect(reporter.specDone.calls.argsFor(0)[0]) + .toEqual(jasmine.objectContaining({status: 'failed'})); + expect(reporter.specDone.calls.argsFor(0)[0].failedExpectations[0].message) + .toEqual("Expected 1 to be 2."); + + expect(reporter.specDone.calls.argsFor(1)[0]) + .toEqual(jasmine.objectContaining({status: 'failed'})); + expect(reporter.specDone.calls.argsFor(1)[0].failedExpectations[0].message) + .toEqual("Expected 1 to be 2."); + done(); + }); + + env.addReporter(reporter); + + env.describe('A suite', function(){ + env.beforeAll(function() { + env.expect(1).toBe(2); + }); + + env.it("spec that will be failed", function() { + }); + + env.describe("nesting", function() { + env.it("another spec to fail", function() { + }); + }); + }); + + env.execute(); + }); + it("Allows specifying which specs and suites to run", function(done) { var env = new j$.Env(), calls = [], @@ -871,5 +909,4 @@ describe("Env integration", function() { env.execute(); }); - }); diff --git a/src/core/Env.js b/src/core/Env.js index f174cf22..fc2b6e80 100644 --- a/src/core/Env.js +++ b/src/core/Env.js @@ -225,6 +225,7 @@ getJasmineRequireObj().Env = function(j$) { parentSuite: currentDeclarationSuite, queueRunner: queueRunnerFactory, onStart: suiteStarted, + expectationFactory: expectationFactory, resultCallback: function(attrs) { if (!suite.disabled) { clearResourcesForRunnable(suite.id); @@ -330,7 +331,7 @@ getJasmineRequireObj().Env = function(j$) { }; this.expect = function(actual) { - return currentSpec.expect(actual); + return currentRunnable().expect(actual); }; this.beforeEach = function(beforeEachFunction) { diff --git a/src/core/Suite.js b/src/core/Suite.js index 29d2d85f..43d02430 100644 --- a/src/core/Suite.js +++ b/src/core/Suite.js @@ -7,6 +7,7 @@ getJasmineRequireObj().Suite = function() { this.onStart = attrs.onStart || function() {}; this.resultCallback = attrs.resultCallback || function() {}; this.clearStack = attrs.clearStack || function(fn) {fn();}; + this.expectationFactory = attrs.expectationFactory; this.beforeFns = []; this.afterFns = []; @@ -25,6 +26,10 @@ getJasmineRequireObj().Suite = function() { }; } + Suite.prototype.expect = function(actual) { + return this.expectationFactory(actual, this); + }; + Suite.prototype.getFullName = function() { var fullName = this.description; for (var parentSuite = this.parentSuite; parentSuite; parentSuite = parentSuite.parentSuite) { @@ -130,6 +135,13 @@ getJasmineRequireObj().Suite = function() { } }; + Suite.prototype.addExpectationResult = function () { + for (var i = 0; i < this.children.length; i++) { + var child = this.children[i]; + child.addExpectationResult.apply(child, arguments); + } + }; + function clone(obj) { var clonedObj = {}; for (var prop in obj) {