Jasmine should recover gracefully when there are errors in describe functions.

This commit is contained in:
Christian Williams 2010-06-04 14:14:31 -04:00
parent 803a2fb2ba
commit ed49104fad
3 changed files with 71 additions and 1 deletions

View File

@ -1083,4 +1083,55 @@ describe("jasmine spec running", function () {
expect(exceptionMessage).toEqual('explodes function should not have been called');
});
it("should recover gracefully when there are errors in describe functions", function() {
var specs = [];
var superSimpleReporter = new jasmine.Reporter();
superSimpleReporter.reportSpecResults = function(spec) {
specs.push("Spec: " + spec.getFullName());
var results = spec.results().getItems();
for (var i = 0; i < results.length; i++) {
var result = results[i];
specs.push("Result: " + result);
}
};
try {
env.describe("outer1", function() {
env.describe("inner1", function() {
env.it("should thingy", function() {
this.expect(true).toEqual(true);
});
throw new Error("fake error");
});
env.describe("inner2", function() {
env.it("should other thingy", function() {
this.expect(true).toEqual(true);
});
});
});
} catch(e) {}
env.describe("outer2", function() {
env.it("should xxx", function() {
this.expect(true).toEqual(true);
});
});
env.addReporter(superSimpleReporter);
env.execute();
expect(specs).toEqual([
'Spec: outer1 inner1 should thingy.',
'Result: Passed.',
'Spec: outer1 encountered a declaration exception.',
'Result: Error: fake error',
'Spec: outer1 inner2 should other thingy.',
'Result: Passed.',
'Spec: outer2 should xxx.',
'Result: Passed.'
]);
});
});

View File

@ -96,10 +96,21 @@ jasmine.Env.prototype.describe = function(description, specDefinitions) {
this.currentSuite = suite;
specDefinitions.call(suite);
var declarationError = null;
try {
specDefinitions.call(suite);
} catch(e) {
declarationError = e;
}
this.currentSuite = parentSuite;
if (declarationError) {
this.it("encountered a declaration exception", function() {
throw declarationError;
});
}
return suite;
};

View File

@ -57,6 +57,10 @@ jasmine.MessageResult = function(text) {
this.trace = new Error(); // todo: test better
};
jasmine.MessageResult.prototype.toString = function() {
return this.text;
};
jasmine.ExpectationResult = function(params) {
this.type = 'ExpectationResult';
this.matcherName = params.matcherName;
@ -71,6 +75,10 @@ jasmine.ExpectationResult = function(params) {
this.trace = this.passed_ ? '' : new Error(this.message);
};
jasmine.ExpectationResult.prototype.toString = function () {
return this.message;
};
jasmine.ExpectationResult.prototype.passed = function () {
return this.passed_;
};