Skip to content

Commit 4f28b5b

Browse files
committed
report skipped tests upon failing beforeEach
1 parent 152cecc commit 4f28b5b

File tree

1 file changed

+38
-30
lines changed

1 file changed

+38
-30
lines changed

lib/runner.js

Lines changed: 38 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -365,9 +365,8 @@ Runner.prototype.hook = function(name, fn) {
365365

366366
function nextHook(i) {
367367
var hook = hooks[i];
368-
if (!hook) {
369-
return fn();
370-
}
368+
if (!hook) return fn();
369+
371370
self.currentRunnable = hook;
372371

373372
if (name === HOOK_TYPE_BEFORE_ALL) {
@@ -399,13 +398,6 @@ Runner.prototype.hook = function(name, fn) {
399398
if (self.test) {
400399
self.test.pending = true;
401400
}
402-
} else if (name === HOOK_TYPE_BEFORE_EACH) {
403-
if (self.test) {
404-
self.test.pending = true;
405-
}
406-
self.emit(constants.EVENT_HOOK_END, hook);
407-
hook.pending = false; // activates hook for next test
408-
return fn(new Error('abort hookDown'));
409401
} else if (name === HOOK_TYPE_BEFORE_ALL) {
410402
suite.tests.forEach(function(test) {
411403
test.pending = true;
@@ -414,6 +406,13 @@ Runner.prototype.hook = function(name, fn) {
414406
suite.pending = true;
415407
});
416408
hooks = [];
409+
} else if (name === HOOK_TYPE_BEFORE_EACH) {
410+
if (self.test) {
411+
self.test.pending = true;
412+
}
413+
self.emit(constants.EVENT_HOOK_END, hook);
414+
hook.pending = false;
415+
return fn(new Error('abort hookDown'));
417416
} else {
418417
hook.pending = false;
419418
var errForbid = createUnsupportedError('`this.skip` forbidden');
@@ -431,6 +430,17 @@ Runner.prototype.hook = function(name, fn) {
431430
suite.skipped = true;
432431
});
433432
hooks = [];
433+
} else if (name === HOOK_TYPE_BEFORE_EACH) {
434+
(function skipTests(sui) {
435+
sui.tests.forEach(function(t) {
436+
if (!t.state) t.skipped = true;
437+
});
438+
sui.suites.forEach(function(s) {
439+
skipTests(s);
440+
});
441+
})(suite);
442+
self.emit(constants.EVENT_HOOK_END, hook);
443+
return fn(err);
434444
} else {
435445
// stop executing hooks, notify callee of hook err
436446
return fn(err);
@@ -571,20 +581,18 @@ Runner.prototype.runTests = function(suite, fn) {
571581
var tests = suite.tests.slice();
572582
var test;
573583

574-
function hookErr(_, errSuite, after) {
575-
// before-/afterEach hook for errSuite failed
584+
function hookErr(_, errSuite) {
585+
// afterEach hook for errSuite failed
576586
var orig = self.suite;
577587

578-
// for failed afterEach hook start from errSuite parent,
579-
// otherwise start from errSuite itself
580-
self.suite = after ? errSuite.parent : errSuite;
588+
self.suite = errSuite.parent;
581589

582590
if (self.suite) {
583591
self.hookUp(HOOK_TYPE_AFTER_EACH, function(err2, errSuite2) {
584592
self.suite = orig;
585593
// some hooks may fail even now
586594
if (err2) {
587-
return hookErr(err2, errSuite2, true);
595+
return hookErr(err2, errSuite2);
588596
}
589597
// report error suite
590598
fn(errSuite);
@@ -602,12 +610,10 @@ Runner.prototype.runTests = function(suite, fn) {
602610

603611
if (self._abort) return fn();
604612

605-
if (err) return hookErr(err, errSuite, true);
613+
if (err) return hookErr(err, errSuite);
606614

607615
// next test
608616
test = tests.shift();
609-
610-
// all done
611617
if (!test) return fn();
612618

613619
// grep
@@ -632,7 +638,7 @@ Runner.prototype.runTests = function(suite, fn) {
632638
return;
633639
}
634640

635-
// static skip or conditional skip within beforeAll
641+
// static skip or conditional skip within hooks
636642
if (test.isPending()) {
637643
if (self.forbidPending) {
638644
self.fail(test, new Error('Pending test forbidden'), true);
@@ -644,7 +650,7 @@ Runner.prototype.runTests = function(suite, fn) {
644650
return nextTest();
645651
}
646652

647-
// skipped by failing beforeAll
653+
// skipped by failing hooks
648654
if (test.isSkipped()) {
649655
test.state = STATE_SKIPPED;
650656
self.emit(constants.EVENT_TEST_SKIPPED, test);
@@ -655,13 +661,17 @@ Runner.prototype.runTests = function(suite, fn) {
655661
// execute test and hook(s)
656662
self.emit(constants.EVENT_TEST_BEGIN, (self.test = test));
657663
self.hookDown(HOOK_TYPE_BEFORE_EACH, function(err, errSuite) {
658-
// conditional skip within beforeEach
659-
if (test.isPending()) {
660-
if (self.forbidPending) {
661-
self.fail(test, new Error('Pending test forbidden'), true);
664+
if (err || test.isPending()) {
665+
if (test.isPending()) {
666+
if (self.forbidPending) {
667+
self.fail(test, new Error('Pending test forbidden'), true);
668+
} else {
669+
test.state = STATE_PENDING;
670+
self.emit(constants.EVENT_TEST_PENDING, test);
671+
}
662672
} else {
663-
test.state = STATE_PENDING;
664-
self.emit(constants.EVENT_TEST_PENDING, test);
673+
test.state = STATE_SKIPPED;
674+
self.emit(constants.EVENT_TEST_SKIPPED, test);
665675
}
666676
self.emit(constants.EVENT_TEST_END, test);
667677
// skip inner afterEach hooks below errSuite level
@@ -672,9 +682,7 @@ Runner.prototype.runTests = function(suite, fn) {
672682
nextTest(e, eSuite);
673683
});
674684
}
675-
if (err) {
676-
return hookErr(err, errSuite, false);
677-
}
685+
678686
self.currentRunnable = self.test;
679687
self.runTest(function(err) {
680688
test = self.test;

0 commit comments

Comments
 (0)