Skip to content

Commit c6d0678

Browse files
committed
Add t.context support on before hooks
1 parent a051d3e commit c6d0678

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
@@ -165,26 +165,26 @@ class TestCollection extends EventEmitter {
165165
return test;
166166
}
167167

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

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

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

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

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

190190
_hasUnskippedTests() {
@@ -195,18 +195,22 @@ class TestCollection extends EventEmitter {
195195
}
196196

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

202204
let finalTests;
203205
// Only run before and after hooks when there are unskipped tests
204206
if (this._hasUnskippedTests()) {
205-
const beforeHooks = new Sequence(this._buildHooks(this.hooks.before));
207+
const context = {context: {}};
208+
209+
const beforeHooks = new Sequence(this._buildHooks(this.hooks.before, null, context));
206210
const afterHooks = new Sequence(this._buildHooks(this.hooks.after));
207-
finalTests = new Sequence([beforeHooks, allTests, afterHooks], true);
211+
finalTests = new Sequence([beforeHooks, sequenceTests(context), afterHooks], true);
208212
} else {
209-
finalTests = new Sequence([allTests], true);
213+
finalTests = new Sequence([sequenceTests()], true);
210214
}
211215

212216
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(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)