Skip to content

Commit

Permalink
Fix #1798: Correctly attribute mutiple done err with hooks
Browse files Browse the repository at this point in the history
  • Loading branch information
danielstjules committed Sep 14, 2015
1 parent 44ba417 commit 10e8604
Show file tree
Hide file tree
Showing 5 changed files with 122 additions and 17 deletions.
9 changes: 5 additions & 4 deletions lib/runner.js
Expand Up @@ -288,12 +288,13 @@ Runner.prototype.hook = function(name, fn) {

self.emit('hook', hook);

hook.on('error', function(err) {
self.failHook(hook, err);
});
if (!hook.listeners('error').length) {
hook.on('error', function(err) {
self.failHook(hook, err);
});
}

hook.run(function(err) {
hook.removeAllListeners('error');
var testError = hook.error();
if (testError) {
self.fail(self.test, testError);
Expand Down
10 changes: 10 additions & 0 deletions test/integration/fixtures/multiple.done.before.js
@@ -0,0 +1,10 @@
describe('suite', function() {
before(function(done) {
setTimeout(done, 10);
setTimeout(done, 30);
});

it('test1', function(done) {
setTimeout(done, 50);
});
});
14 changes: 14 additions & 0 deletions test/integration/fixtures/multiple.done.beforeEach.js
@@ -0,0 +1,14 @@
describe('suite', function() {
beforeEach(function(done) {
setTimeout(done, 10);
setTimeout(done, 20);
});

it('test1', function(done) {
setTimeout(done, 50);
});

it('test2', function(done) {
setTimeout(done, 50);
});
});
10 changes: 10 additions & 0 deletions test/integration/fixtures/multiple.done.specs.js
@@ -0,0 +1,10 @@
describe('suite', function() {
it('test1', function(done) {
done();
setTimeout(done, 10);
});

it('test2', function(done) {
setTimeout(done, 20);
});
});
96 changes: 83 additions & 13 deletions test/integration/multiple.done.js
Expand Up @@ -4,25 +4,95 @@ var args = [];

describe('multiple calls to done()', function() {
var res;

this.timeout(1000);

before(function(done) {
run('multiple.done.js', args, function(err, result) {
res = result;
done(err);
describe('from a spec', function() {
before(function(done) {
run('multiple.done.js', args, function(err, result) {
res = result;
done(err);
});
});

it('results in failures', function() {
assert.equal(res.stats.pending, 0);
assert.equal(res.stats.passes, 1);
assert.equal(res.stats.failures, 1);
assert.equal(res.code, 1);
});

it('throws a descriptive error', function() {
assert.equal(res.failures[0].err.message,
'done() called multiple times');
});
});

describe('with multiple specs', function() {
before(function(done) {
run('multiple.done.specs.js', args, function(err, result) {
res = result;
done(err);
});
});

it('results in a failure', function() {
assert.equal(res.stats.pending, 0);
assert.equal(res.stats.passes, 2);
assert.equal(res.stats.failures, 1);
assert.equal(res.code, 1);
});

it('correctly attributes the error', function() {
assert.equal(res.failures[0].fullTitle, 'suite test1');
assert.equal(res.failures[0].err.message,
'done() called multiple times');
});
});

it('results in failures', function() {
assert.equal(res.stats.pending, 0);
assert.equal(res.stats.passes, 1);
assert.equal(res.stats.failures, 1);
assert.equal(res.code, 1);
describe('from a before hook', function() {
before(function(done) {
run('multiple.done.before.js', args, function(err, result) {
res = result;
done(err);
});
});

it('results in a failure', function() {
assert.equal(res.stats.pending, 0);
assert.equal(res.stats.passes, 1);
assert.equal(res.stats.failures, 1);
assert.equal(res.code, 1);
});

it('correctly attributes the error', function() {
assert.equal(res.failures[0].fullTitle, 'suite "before all" hook');
assert.equal(res.failures[0].err.message,
'done() called multiple times');
});
});

it('throws a descriptive error', function() {
assert.equal(res.failures[0].err.message,
'done() called multiple times');
describe('from a beforeEach hook', function() {
before(function(done) {
run('multiple.done.beforeEach.js', args, function(err, result) {
res = result;
done(err);
});
});

it('results in a failure', function() {
assert.equal(res.stats.pending, 0);
assert.equal(res.stats.passes, 2);
assert.equal(res.stats.failures, 2);
assert.equal(res.code, 2);
});

it('correctly attributes the errors', function() {
assert.equal(res.failures.length, 2);
res.failures.forEach(function(failure) {
assert.equal(failure.fullTitle, 'suite "before each" hook');
assert.equal(failure.err.message,
'done() called multiple times');
});
});
});
});

0 comments on commit 10e8604

Please sign in to comment.