From 81e16c68b5e1bd6660577b7432b45e1584f18751 Mon Sep 17 00:00:00 2001 From: Scott Santucci Date: Thu, 28 Sep 2017 20:20:10 -0400 Subject: [PATCH] Print failures for pending/only forbidden (#2874) --- lib/runner.js | 34 ++++++++---- .../options/forbid-only/only-suite.js | 5 ++ .../forbid-pending/before-this.skip.js | 6 +++ .../forbid-pending/beforeEach-this.skip.js | 6 +++ .../options/forbid-pending/skip-suite.js | 5 ++ .../options/forbid-pending/this.skip.js | 7 +++ test/integration/options.spec.js | 52 +++++++++++++++++++ 7 files changed, 106 insertions(+), 9 deletions(-) create mode 100644 test/integration/fixtures/options/forbid-only/only-suite.js create mode 100644 test/integration/fixtures/options/forbid-pending/before-this.skip.js create mode 100644 test/integration/fixtures/options/forbid-pending/beforeEach-this.skip.js create mode 100644 test/integration/fixtures/options/forbid-pending/skip-suite.js create mode 100644 test/integration/fixtures/options/forbid-pending/this.skip.js diff --git a/lib/runner.js b/lib/runner.js index fad9a8b1f8..1a7bc35cdb 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -429,6 +429,10 @@ Runner.prototype.runTest = function (fn) { if (!test) { return; } + if (this.forbidOnly && this.hasOnly) { + fn(new Error('`.only` forbidden')); + return; + } if (this.asyncOnly) { test.asyncOnly = true; } @@ -529,7 +533,13 @@ Runner.prototype.runTests = function (suite, fn) { } if (test.isPending()) { - self.emit('pending', test); + if (self.forbidPending) { + test.isPending = alwaysFalse; + self.fail(test, new Error('Pending test forbidden')); + delete test.isPending; + } else { + self.emit('pending', test); + } self.emit('test end', test); return next(); } @@ -538,7 +548,13 @@ Runner.prototype.runTests = function (suite, fn) { self.emit('test', self.test = test); self.hookDown('beforeEach', function (err, errSuite) { if (test.isPending()) { - self.emit('pending', test); + if (self.forbidPending) { + test.isPending = alwaysFalse; + self.fail(test, new Error('Pending test forbidden')); + delete test.isPending; + } else { + self.emit('pending', test); + } self.emit('test end', test); return next(); } @@ -550,7 +566,9 @@ Runner.prototype.runTests = function (suite, fn) { test = self.test; if (err) { var retry = test.currentRetry(); - if (err instanceof Pending) { + if (err instanceof Pending && self.forbidPending) { + self.fail(test, new Error('Pending test forbidden')); + } else if (err instanceof Pending) { test.pending = true; self.emit('pending', test); } else if (retry < test.retries()) { @@ -586,6 +604,10 @@ Runner.prototype.runTests = function (suite, fn) { next(); }; +function alwaysFalse () { + return false; +} + /** * Run the given `suite` and invoke the callback `fn()` when complete. * @@ -820,12 +842,6 @@ Runner.prototype.run = function (fn) { // callback this.on('end', function () { - if (self.forbidOnly && self.hasOnly) { - self.failures += self.stats.tests; - } - if (self.forbidPending) { - self.failures += self.stats.pending; - } debug('end'); process.removeListener('uncaughtException', uncaught); fn(self.failures); diff --git a/test/integration/fixtures/options/forbid-only/only-suite.js b/test/integration/fixtures/options/forbid-only/only-suite.js new file mode 100644 index 0000000000..ba15a5a2df --- /dev/null +++ b/test/integration/fixtures/options/forbid-only/only-suite.js @@ -0,0 +1,5 @@ +'use strict'; + +describe.only('forbid only - suite marked with only', function () { + it('test1', function () {}); +}); diff --git a/test/integration/fixtures/options/forbid-pending/before-this.skip.js b/test/integration/fixtures/options/forbid-pending/before-this.skip.js new file mode 100644 index 0000000000..7c329dff4a --- /dev/null +++ b/test/integration/fixtures/options/forbid-pending/before-this.skip.js @@ -0,0 +1,6 @@ +'use strict'; + +describe('forbid pending - before calls `skip()`', function () { + it('test', function () {}); + before(function () { this.skip(); }); +}); diff --git a/test/integration/fixtures/options/forbid-pending/beforeEach-this.skip.js b/test/integration/fixtures/options/forbid-pending/beforeEach-this.skip.js new file mode 100644 index 0000000000..58fa1fe8a3 --- /dev/null +++ b/test/integration/fixtures/options/forbid-pending/beforeEach-this.skip.js @@ -0,0 +1,6 @@ +'use strict'; + +describe('forbid pending - beforeEach calls `skip()`', function () { + it('test', function () {}); + beforeEach(function () { this.skip(); }); +}); diff --git a/test/integration/fixtures/options/forbid-pending/skip-suite.js b/test/integration/fixtures/options/forbid-pending/skip-suite.js new file mode 100644 index 0000000000..fe0a4578f0 --- /dev/null +++ b/test/integration/fixtures/options/forbid-pending/skip-suite.js @@ -0,0 +1,5 @@ +'use strict'; + +describe.skip('forbid pending - suite marked with skip', function () { + it('test1', function () {}); +}); diff --git a/test/integration/fixtures/options/forbid-pending/this.skip.js b/test/integration/fixtures/options/forbid-pending/this.skip.js new file mode 100644 index 0000000000..a920813250 --- /dev/null +++ b/test/integration/fixtures/options/forbid-pending/this.skip.js @@ -0,0 +1,7 @@ +'use strict'; + +describe('forbid pending - test calls `skip()`', function () { + it('test1', function () {}); + it('test2', function () { this.skip(); }); + it('test3', function () {}); +}); diff --git a/test/integration/options.spec.js b/test/integration/options.spec.js index be4abf53c5..bdfee9d0e1 100644 --- a/test/integration/options.spec.js +++ b/test/integration/options.spec.js @@ -215,6 +215,8 @@ describe('options', function () { }); describe('--forbid-only', function () { + var onlyErrorMessage = '`.only` forbidden'; + before(function () { args = ['--forbid-only']; }); @@ -237,12 +239,24 @@ describe('options', function () { return; } assert.equal(res.code, 1); + assert.equal(res.failures[0].err.message, onlyErrorMessage); + done(); + }); + }); + + it('fails if there are tests in suites marked only', function (done) { + run('options/forbid-only/only-suite.js', args, function (err, res) { + assert(!err); + assert.equal(res.code, 1); + assert.equal(res.failures[0].err.message, onlyErrorMessage); done(); }); }); }); describe('--forbid-pending', function () { + var pendingErrorMessage = 'Pending test forbidden'; + before(function () { args = ['--forbid-pending']; }); @@ -265,6 +279,7 @@ describe('options', function () { return; } assert.equal(res.code, 1); + assert.equal(res.failures[0].err.message, pendingErrorMessage); done(); }); }); @@ -276,6 +291,43 @@ describe('options', function () { return; } assert.equal(res.code, 1); + assert.equal(res.failures[0].err.message, pendingErrorMessage); + done(); + }); + }); + + it('fails if tests call `skip()`', function (done) { + run('options/forbid-pending/this.skip.js', args, function (err, res) { + assert(!err); + assert.equal(res.code, 1); + assert.equal(res.failures[0].err.message, pendingErrorMessage); + done(); + }); + }); + + it('fails if beforeEach calls `skip()`', function (done) { + run('options/forbid-pending/beforeEach-this.skip.js', args, function (err, res) { + assert(!err); + assert.equal(res.code, 1); + assert.equal(res.failures[0].err.message, pendingErrorMessage); + done(); + }); + }); + + it('fails if before calls `skip()`', function (done) { + run('options/forbid-pending/before-this.skip.js', args, function (err, res) { + assert(!err); + assert.equal(res.code, 1); + assert.equal(res.failures[0].err.message, pendingErrorMessage); + done(); + }); + }); + + it('fails if there are tests in suites marked skip', function (done) { + run('options/forbid-pending/skip-suite.js', args, function (err, res) { + assert(!err); + assert.equal(res.code, 1); + assert.equal(res.failures[0].err.message, pendingErrorMessage); done(); }); });