Skip to content

Commit 6591a8e

Browse files
committed
Add t.context support on before hooks
1 parent 47b8b56 commit 6591a8e

File tree

2 files changed

+26
-20
lines changed

2 files changed

+26
-20
lines changed

lib/test-collection.js

+18-14
Original file line numberDiff line numberDiff line change
@@ -164,26 +164,26 @@ class TestCollection extends EventEmitter {
164164
return test;
165165
}
166166

167-
_buildTestWithHooks(test) {
167+
_buildTestWithHooks(test, context) {
168168
if (test.metadata.skipped || test.metadata.todo) {
169169
return new Sequence([this._skippedTest(this._buildTest(test))], true);
170170
}
171171

172-
const context = {context: {}};
172+
const contextRef = context ? Object.create(context) : {context: {}};
173173

174-
const beforeHooks = this._buildHooks(this.hooks.beforeEach, test.title, context);
175-
const afterHooks = this._buildHooks(this.hooks.afterEach, test.title, context);
174+
const beforeHooks = this._buildHooks(this.hooks.beforeEach, test.title, contextRef);
175+
const afterHooks = this._buildHooks(this.hooks.afterEach, test.title, contextRef);
176176

177-
let sequence = new Sequence([].concat(beforeHooks, this._buildTest(test, context), afterHooks), true);
177+
let sequence = new Sequence([].concat(beforeHooks, this._buildTest(test, contextRef), afterHooks), true);
178178
if (this.hooks.afterEachAlways.length > 0) {
179-
const afterAlwaysHooks = new Sequence(this._buildHooks(this.hooks.afterEachAlways, test.title, context));
179+
const afterAlwaysHooks = new Sequence(this._buildHooks(this.hooks.afterEachAlways, test.title, contextRef));
180180
sequence = new Sequence([sequence, afterAlwaysHooks], false);
181181
}
182182
return sequence;
183183
}
184184

185-
_buildTests(tests) {
186-
return tests.map(test => this._buildTestWithHooks(test));
185+
_buildTests(tests, context) {
186+
return tests.map(test => this._buildTestWithHooks(test, context));
187187
}
188188

189189
_hasUnskippedTests() {
@@ -194,18 +194,22 @@ class TestCollection extends EventEmitter {
194194
}
195195

196196
build() {
197-
const serialTests = new Sequence(this._buildTests(this.tests.serial), this.bail);
198-
const concurrentTests = new Concurrent(this._buildTests(this.tests.concurrent), this.bail);
199-
const allTests = new Sequence([serialTests, concurrentTests]);
197+
const sequenceTests = context => {
198+
const serialTests = new Sequence(this._buildTests(this.tests.serial, context), this.bail);
199+
const concurrentTests = new Concurrent(this._buildTests(this.tests.concurrent, context), this.bail);
200+
return new Sequence([serialTests, concurrentTests]);
201+
};
200202

201203
let finalTests;
202204
// Only run before and after hooks when there are unskipped tests
203205
if (this._hasUnskippedTests()) {
204-
const beforeHooks = new Sequence(this._buildHooks(this.hooks.before));
206+
const context = {context: {}};
207+
208+
const beforeHooks = new Sequence(this._buildHooks(this.hooks.before, null, context));
205209
const afterHooks = new Sequence(this._buildHooks(this.hooks.after));
206-
finalTests = new Sequence([beforeHooks, allTests, afterHooks], true);
210+
finalTests = new Sequence([beforeHooks, sequenceTests(context), afterHooks], true);
207211
} else {
208-
finalTests = new Sequence([allTests], true);
212+
finalTests = new Sequence([sequenceTests()], true);
209213
}
210214

211215
if (this.hooks.afterAlways.length > 0) {

test/hooks.js

+8-6
Original file line numberDiff line numberDiff line change
@@ -454,26 +454,28 @@ test('shared context', t => {
454454
const runner = new Runner();
455455

456456
runner.chain.before(a => {
457-
a.is(a.context, null);
457+
a.deepEqual(a.context, {});
458+
a.context.arr = ['a'];
458459
});
459460

460461
runner.chain.after(a => {
461462
a.is(a.context, null);
462463
});
463464

464465
runner.chain.beforeEach(a => {
465-
a.context.arr = ['a'];
466+
a.context.arr.push('b');
467+
a.deepEqual(a.context.arr, ['a', 'b']);
466468
});
467469

468470
runner.chain.test('test', a => {
469471
a.pass();
470-
a.context.arr.push('b');
471-
a.deepEqual(a.context.arr, ['a', 'b']);
472+
a.context.arr.push('c');
473+
a.deepEqual(a.context.arr, ['a', 'b', 'c']);
472474
});
473475

474476
runner.chain.afterEach(a => {
475-
a.context.arr.push('c');
476-
a.deepEqual(a.context.arr, ['a', 'b', 'c']);
477+
a.context.arr.push('d');
478+
a.deepEqual(a.context.arr, ['a', 'b', 'c', 'd']);
477479
});
478480

479481
return runner.run({}).then(() => {

0 commit comments

Comments
 (0)