Specs without expectations should be alerted to the user
- Add console.error to the HtmlReporter when there is a spec without any expectation - Change the spec's link text and color to include a warning - Create a status for specs to label them as "empty" - console is not accessible to IE unless you have developer tools open, so protect against that by mocking console. [#59424794]
This commit is contained in:
parent
71dbffeaef
commit
1922514f2d
@@ -95,6 +95,10 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|||||||
|
|
||||||
var failures = [];
|
var failures = [];
|
||||||
this.specDone = function(result) {
|
this.specDone = function(result) {
|
||||||
|
if(result.status == 'empty' && console && console.error) {
|
||||||
|
console.error('Spec \'' + result.fullName + '\' has no expectations.');
|
||||||
|
}
|
||||||
|
|
||||||
if (result.status != 'disabled') {
|
if (result.status != 'disabled') {
|
||||||
specsExecuted++;
|
specsExecuted++;
|
||||||
}
|
}
|
||||||
@@ -189,12 +193,16 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|||||||
specListNode = createDom('ul', {className: 'specs'});
|
specListNode = createDom('ul', {className: 'specs'});
|
||||||
domParent.appendChild(specListNode);
|
domParent.appendChild(specListNode);
|
||||||
}
|
}
|
||||||
|
var specDescription = resultNode.result.description;
|
||||||
|
if(resultNode.result.status == 'empty') {
|
||||||
|
specDescription = 'SPEC HAS NO EXPECTATIONS ' + specDescription;
|
||||||
|
}
|
||||||
specListNode.appendChild(
|
specListNode.appendChild(
|
||||||
createDom('li', {
|
createDom('li', {
|
||||||
className: resultNode.result.status,
|
className: resultNode.result.status,
|
||||||
id: 'spec-' + resultNode.result.id
|
id: 'spec-' + resultNode.result.id
|
||||||
},
|
},
|
||||||
createDom('a', {href: specHref(resultNode.result)}, resultNode.result.description)
|
createDom('a', {href: specHref(resultNode.result)}, specDescription)
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ body { background-color: #eeeeee; padding: 0; margin: 5px; overflow-y: scroll; }
|
|||||||
.html-reporter .summary ul.suite { margin-top: 7px; margin-bottom: 7px; }
|
.html-reporter .summary ul.suite { margin-top: 7px; margin-bottom: 7px; }
|
||||||
.html-reporter .summary li.passed a { color: #007069; }
|
.html-reporter .summary li.passed a { color: #007069; }
|
||||||
.html-reporter .summary li.failed a { color: #ca3a11; }
|
.html-reporter .summary li.failed a { color: #ca3a11; }
|
||||||
|
.html-reporter .summary li.empty a { color: #ba9d37; }
|
||||||
.html-reporter .summary li.pending a { color: #ba9d37; }
|
.html-reporter .summary li.pending a { color: #ba9d37; }
|
||||||
.html-reporter .description + .suite { margin-top: 0; }
|
.html-reporter .description + .suite { margin-top: 0; }
|
||||||
.html-reporter .suite { margin-top: 14px; }
|
.html-reporter .suite { margin-top: 14px; }
|
||||||
|
|||||||
@@ -242,6 +242,7 @@ getJasmineRequireObj().Spec = function(j$) {
|
|||||||
this.expectationResultFactory = attrs.expectationResultFactory || function() { };
|
this.expectationResultFactory = attrs.expectationResultFactory || function() { };
|
||||||
this.queueRunnerFactory = attrs.queueRunnerFactory || function() {};
|
this.queueRunnerFactory = attrs.queueRunnerFactory || function() {};
|
||||||
this.catchingExceptions = attrs.catchingExceptions || function() { return true; };
|
this.catchingExceptions = attrs.catchingExceptions || function() { return true; };
|
||||||
|
this.expectCalled = false;
|
||||||
|
|
||||||
if (!this.fn) {
|
if (!this.fn) {
|
||||||
this.pend();
|
this.pend();
|
||||||
@@ -256,6 +257,7 @@ getJasmineRequireObj().Spec = function(j$) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Spec.prototype.addExpectationResult = function(passed, data) {
|
Spec.prototype.addExpectationResult = function(passed, data) {
|
||||||
|
this.expectCalled = true;
|
||||||
if (passed) {
|
if (passed) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -327,6 +329,10 @@ getJasmineRequireObj().Spec = function(j$) {
|
|||||||
return 'pending';
|
return 'pending';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!this.expectCalled) {
|
||||||
|
return 'empty';
|
||||||
|
}
|
||||||
|
|
||||||
if (this.result.failedExpectations.length > 0) {
|
if (this.result.failedExpectations.length > 0) {
|
||||||
return 'failed';
|
return 'failed';
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -193,9 +193,10 @@ describe("Spec", function() {
|
|||||||
expect(done).toHaveBeenCalled();
|
expect(done).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("#status returns passing by default", function() {
|
it("#status returns empty by default", function(){
|
||||||
var spec = new j$.Spec({fn: jasmine.createSpy("spec body")});
|
var emptySpec = new j$.Spec({ fn: function () {} });
|
||||||
expect(spec.status()).toEqual('passed');
|
emptySpec.execute();
|
||||||
|
expect(emptySpec.status()).toBe("empty");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("#status returns passed if all expectations in the spec have passed", function() {
|
it("#status returns passed if all expectations in the spec have passed", function() {
|
||||||
|
|||||||
@@ -46,6 +46,32 @@ describe("New HtmlReporter", function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
describe("when a spec is done", function() {
|
describe("when a spec is done", function() {
|
||||||
|
it("logs errors to the console if it is an empty spec", function() {
|
||||||
|
if (!window.console) {
|
||||||
|
window.console = { error: function(){} };
|
||||||
|
}
|
||||||
|
|
||||||
|
var env = new j$.Env(),
|
||||||
|
container = document.createElement('div'),
|
||||||
|
getContainer = function() {return container;},
|
||||||
|
reporter = new j$.HtmlReporter({
|
||||||
|
env: env,
|
||||||
|
getContainer: getContainer,
|
||||||
|
createElement: function() { return document.createElement.apply(document, arguments); },
|
||||||
|
createTextNode: function() { return document.createTextNode.apply(document, arguments); }
|
||||||
|
});
|
||||||
|
|
||||||
|
spyOn(console, 'error');
|
||||||
|
|
||||||
|
reporter.initialize();
|
||||||
|
|
||||||
|
reporter.specDone({
|
||||||
|
status: "empty",
|
||||||
|
fullName: 'Some Name'
|
||||||
|
});
|
||||||
|
expect(console.error).toHaveBeenCalledWith("Spec \'Some Name\' has no expectations.");
|
||||||
|
});
|
||||||
|
|
||||||
it("reports the status symbol of a disabled spec", function() {
|
it("reports the status symbol of a disabled spec", function() {
|
||||||
var env = new j$.Env(),
|
var env = new j$.Env(),
|
||||||
container = document.createElement("div"),
|
container = document.createElement("div"),
|
||||||
@@ -131,6 +157,46 @@ describe("New HtmlReporter", function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
describe("when Jasmine is done", function() {
|
describe("when Jasmine is done", function() {
|
||||||
|
it("adds EMPTY to the link title of specs that have no expectations", function() {
|
||||||
|
if (!window.console) {
|
||||||
|
window.console = { error: function(){} };
|
||||||
|
}
|
||||||
|
var env = new j$.Env(),
|
||||||
|
container = document.createElement('div'),
|
||||||
|
getContainer = function() {return container;},
|
||||||
|
reporter = new j$.HtmlReporter({
|
||||||
|
env: env,
|
||||||
|
getContainer: getContainer,
|
||||||
|
createElement: function() { return document.createElement.apply(document, arguments); },
|
||||||
|
createTextNode: function() { return document.createTextNode.apply(document, arguments); }
|
||||||
|
});
|
||||||
|
|
||||||
|
spyOn(console, 'error');
|
||||||
|
|
||||||
|
reporter.initialize();
|
||||||
|
reporter.jasmineStarted({});
|
||||||
|
reporter.suiteStarted({id: 1});
|
||||||
|
reporter.specStarted({
|
||||||
|
status: "empty",
|
||||||
|
id: 1,
|
||||||
|
description: 'Spec Description'
|
||||||
|
});
|
||||||
|
reporter.specDone({
|
||||||
|
status: "empty",
|
||||||
|
id: 1,
|
||||||
|
description: 'Spec Description'
|
||||||
|
});
|
||||||
|
reporter.suiteDone({id: 1});
|
||||||
|
reporter.jasmineDone({});
|
||||||
|
|
||||||
|
var summary = container.querySelector('.summary');
|
||||||
|
var suite = summary.childNodes[0];
|
||||||
|
var specs = suite.childNodes[1];
|
||||||
|
var spec = specs.childNodes[0];
|
||||||
|
var specLink = spec.childNodes[0];
|
||||||
|
expect(specLink.innerHTML).toMatch(/SPEC HAS NO EXPECTATIONS/);
|
||||||
|
});
|
||||||
|
|
||||||
it("reports the run time", function() {
|
it("reports the run time", function() {
|
||||||
var env = new j$.Env(),
|
var env = new j$.Env(),
|
||||||
container = document.createElement("div"),
|
container = document.createElement("div"),
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ getJasmineRequireObj().Spec = function(j$) {
|
|||||||
this.expectationResultFactory = attrs.expectationResultFactory || function() { };
|
this.expectationResultFactory = attrs.expectationResultFactory || function() { };
|
||||||
this.queueRunnerFactory = attrs.queueRunnerFactory || function() {};
|
this.queueRunnerFactory = attrs.queueRunnerFactory || function() {};
|
||||||
this.catchingExceptions = attrs.catchingExceptions || function() { return true; };
|
this.catchingExceptions = attrs.catchingExceptions || function() { return true; };
|
||||||
|
this.expectCalled = false;
|
||||||
|
|
||||||
if (!this.fn) {
|
if (!this.fn) {
|
||||||
this.pend();
|
this.pend();
|
||||||
@@ -27,6 +28,7 @@ getJasmineRequireObj().Spec = function(j$) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Spec.prototype.addExpectationResult = function(passed, data) {
|
Spec.prototype.addExpectationResult = function(passed, data) {
|
||||||
|
this.expectCalled = true;
|
||||||
if (passed) {
|
if (passed) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -98,6 +100,10 @@ getJasmineRequireObj().Spec = function(j$) {
|
|||||||
return 'pending';
|
return 'pending';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!this.expectCalled) {
|
||||||
|
return 'empty';
|
||||||
|
}
|
||||||
|
|
||||||
if (this.result.failedExpectations.length > 0) {
|
if (this.result.failedExpectations.length > 0) {
|
||||||
return 'failed';
|
return 'failed';
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -66,6 +66,10 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|||||||
|
|
||||||
var failures = [];
|
var failures = [];
|
||||||
this.specDone = function(result) {
|
this.specDone = function(result) {
|
||||||
|
if(result.status == 'empty' && console && console.error) {
|
||||||
|
console.error('Spec \'' + result.fullName + '\' has no expectations.');
|
||||||
|
}
|
||||||
|
|
||||||
if (result.status != 'disabled') {
|
if (result.status != 'disabled') {
|
||||||
specsExecuted++;
|
specsExecuted++;
|
||||||
}
|
}
|
||||||
@@ -160,12 +164,16 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|||||||
specListNode = createDom('ul', {className: 'specs'});
|
specListNode = createDom('ul', {className: 'specs'});
|
||||||
domParent.appendChild(specListNode);
|
domParent.appendChild(specListNode);
|
||||||
}
|
}
|
||||||
|
var specDescription = resultNode.result.description;
|
||||||
|
if(resultNode.result.status == 'empty') {
|
||||||
|
specDescription = 'SPEC HAS NO EXPECTATIONS ' + specDescription;
|
||||||
|
}
|
||||||
specListNode.appendChild(
|
specListNode.appendChild(
|
||||||
createDom('li', {
|
createDom('li', {
|
||||||
className: resultNode.result.status,
|
className: resultNode.result.status,
|
||||||
id: 'spec-' + resultNode.result.id
|
id: 'spec-' + resultNode.result.id
|
||||||
},
|
},
|
||||||
createDom('a', {href: specHref(resultNode.result)}, resultNode.result.description)
|
createDom('a', {href: specHref(resultNode.result)}, specDescription)
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ $page-background-color: #eee;
|
|||||||
$passing-color: #007069;
|
$passing-color: #007069;
|
||||||
$failing-color: #ca3a11;
|
$failing-color: #ca3a11;
|
||||||
$pending-color: #ba9d37;
|
$pending-color: #ba9d37;
|
||||||
|
$empty-color: #eff543;
|
||||||
$neutral-color: #bababa;
|
$neutral-color: #bababa;
|
||||||
|
|
||||||
$font-size: 11px;
|
$font-size: 11px;
|
||||||
@@ -152,7 +152,7 @@ body {
|
|||||||
color: #eee;
|
color: #eee;
|
||||||
|
|
||||||
&.failed {
|
&.failed {
|
||||||
background-color: $failing-color
|
background-color: $failing-color;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.passed {
|
&.passed {
|
||||||
@@ -260,6 +260,10 @@ body {
|
|||||||
color: $failing-color;
|
color: $failing-color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.empty a {
|
||||||
|
color: $pending-color;
|
||||||
|
}
|
||||||
|
|
||||||
&.pending a {
|
&.pending a {
|
||||||
color: $pending-color;
|
color: $pending-color;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user