Skip to content

Commit ccee5f1

Browse files
authored
Base reporter store ref to console.log (#3725)
* add console.log ref * inherit println * unit test change * use static property and fix test * fix base test * rename consoleLog * test include Base.consoleLog check * linter rule so reporters dont console.log * use hooks for stubs with base test * restore stub dont callThrough * fix test + rebase * fix faulty rebase. Removed printLn * remove superfluous base
1 parent 47318a7 commit ccee5f1

File tree

11 files changed

+79
-37
lines changed

11 files changed

+79
-37
lines changed

.eslintrc.yml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,3 +79,12 @@ overrides:
7979
parserOptions:
8080
ecmaVersion: 6
8181
sourceType: module
82+
83+
- files:
84+
- lib/reporters/*.js
85+
rules:
86+
no-restricted-syntax:
87+
- error
88+
# disallow Reporters using `console.log()`
89+
- selector: 'CallExpression[callee.object.name=console][callee.property.name=log]'
90+
message: &GH-3604 See https://github.com/mochajs/mocha/issues/3604

lib/reporters/base.js

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ exports = module.exports = Base;
2727

2828
var isatty = tty.isatty(1) && tty.isatty(2);
2929

30+
/**
31+
* Save log references to avoid tests interfering (see GH-3604).
32+
*/
33+
var consoleLog = console.log;
34+
3035
/**
3136
* Enable coloring by default, except in the browser interface.
3237
*/
@@ -192,7 +197,7 @@ var generateDiff = (exports.generateDiff = function(actual, expected) {
192197
* Error property
193198
*/
194199
exports.list = function(failures) {
195-
console.log();
200+
Base.consoleLog();
196201
failures.forEach(function(test, i) {
197202
// format
198203
var fmt =
@@ -253,7 +258,7 @@ exports.list = function(failures) {
253258
testTitle += str;
254259
});
255260

256-
console.log(fmt, i + 1, testTitle, msg, stack);
261+
Base.consoleLog(fmt, i + 1, testTitle, msg, stack);
257262
});
258263
};
259264

@@ -308,34 +313,34 @@ Base.prototype.epilogue = function() {
308313
var stats = this.stats;
309314
var fmt;
310315

311-
console.log();
316+
Base.consoleLog();
312317

313318
// passes
314319
fmt =
315320
color('bright pass', ' ') +
316321
color('green', ' %d passing') +
317322
color('light', ' (%s)');
318323

319-
console.log(fmt, stats.passes || 0, milliseconds(stats.duration));
324+
Base.consoleLog(fmt, stats.passes || 0, milliseconds(stats.duration));
320325

321326
// pending
322327
if (stats.pending) {
323328
fmt = color('pending', ' ') + color('pending', ' %d pending');
324329

325-
console.log(fmt, stats.pending);
330+
Base.consoleLog(fmt, stats.pending);
326331
}
327332

328333
// failures
329334
if (stats.failures) {
330335
fmt = color('fail', ' %d failing');
331336

332-
console.log(fmt, stats.failures);
337+
Base.consoleLog(fmt, stats.failures);
333338

334339
Base.list(this.failures);
335-
console.log();
340+
Base.consoleLog();
336341
}
337342

338-
console.log();
343+
Base.consoleLog();
339344
};
340345

341346
/**
@@ -488,4 +493,6 @@ function sameType(a, b) {
488493
return objToString.call(a) === objToString.call(b);
489494
}
490495

496+
Base.consoleLog = consoleLog;
497+
491498
Base.abstract = true;

lib/reporters/doc.js

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,41 +44,45 @@ function Doc(runner, options) {
4444
return;
4545
}
4646
++indents;
47-
console.log('%s<section class="suite">', indent());
47+
Base.consoleLog('%s<section class="suite">', indent());
4848
++indents;
49-
console.log('%s<h1>%s</h1>', indent(), utils.escape(suite.title));
50-
console.log('%s<dl>', indent());
49+
Base.consoleLog('%s<h1>%s</h1>', indent(), utils.escape(suite.title));
50+
Base.consoleLog('%s<dl>', indent());
5151
});
5252

5353
runner.on(EVENT_SUITE_END, function(suite) {
5454
if (suite.root) {
5555
return;
5656
}
57-
console.log('%s</dl>', indent());
57+
Base.consoleLog('%s</dl>', indent());
5858
--indents;
59-
console.log('%s</section>', indent());
59+
Base.consoleLog('%s</section>', indent());
6060
--indents;
6161
});
6262

6363
runner.on(EVENT_TEST_PASS, function(test) {
64-
console.log('%s <dt>%s</dt>', indent(), utils.escape(test.title));
64+
Base.consoleLog('%s <dt>%s</dt>', indent(), utils.escape(test.title));
6565
var code = utils.escape(utils.clean(test.body));
66-
console.log('%s <dd><pre><code>%s</code></pre></dd>', indent(), code);
66+
Base.consoleLog('%s <dd><pre><code>%s</code></pre></dd>', indent(), code);
6767
});
6868

6969
runner.on(EVENT_TEST_FAIL, function(test, err) {
70-
console.log(
70+
Base.consoleLog(
7171
'%s <dt class="error">%s</dt>',
7272
indent(),
7373
utils.escape(test.title)
7474
);
7575
var code = utils.escape(utils.clean(test.body));
76-
console.log(
76+
Base.consoleLog(
7777
'%s <dd class="error"><pre><code>%s</code></pre></dd>',
7878
indent(),
7979
code
8080
);
81-
console.log('%s <dd class="error">%s</dd>', indent(), utils.escape(err));
81+
Base.consoleLog(
82+
'%s <dd class="error">%s</dd>',
83+
indent(),
84+
utils.escape(err)
85+
);
8286
});
8387
}
8488

lib/reporters/dot.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ function Dot(runner, options) {
6868
});
6969

7070
runner.once(EVENT_RUN_END, function() {
71-
console.log();
71+
process.stdout.write('\n');
7272
self.epilogue();
7373
});
7474
}

lib/reporters/landing.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ function Landing(runner, options) {
9595

9696
runner.once(EVENT_RUN_END, function() {
9797
cursor.show();
98-
console.log();
98+
process.stdout.write('\n');
9999
self.epilogue();
100100
});
101101
}

lib/reporters/list.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ function List(runner, options) {
4141
var n = 0;
4242

4343
runner.on(EVENT_RUN_BEGIN, function() {
44-
console.log();
44+
Base.consoleLog();
4545
});
4646

4747
runner.on(EVENT_TEST_BEGIN, function(test) {
@@ -50,7 +50,7 @@ function List(runner, options) {
5050

5151
runner.on(EVENT_TEST_PENDING, function(test) {
5252
var fmt = color('checkmark', ' -') + color('pending', ' %s');
53-
console.log(fmt, test.fullTitle());
53+
Base.consoleLog(fmt, test.fullTitle());
5454
});
5555

5656
runner.on(EVENT_TEST_PASS, function(test) {
@@ -59,12 +59,12 @@ function List(runner, options) {
5959
color('pass', ' %s: ') +
6060
color(test.speed, '%dms');
6161
cursor.CR();
62-
console.log(fmt, test.fullTitle(), test.duration);
62+
Base.consoleLog(fmt, test.fullTitle(), test.duration);
6363
});
6464

6565
runner.on(EVENT_TEST_FAIL, function(test) {
6666
cursor.CR();
67-
console.log(color('fail', ' %d) %s'), ++n, test.fullTitle());
67+
Base.consoleLog(color('fail', ' %d) %s'), ++n, test.fullTitle());
6868
});
6969

7070
runner.once(EVENT_RUN_END, self.epilogue.bind(self));

lib/reporters/progress.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ function Progress(runner, options) {
5858

5959
// tests started
6060
runner.on(EVENT_RUN_BEGIN, function() {
61-
console.log();
61+
process.stdout.write('\n');
6262
cursor.hide();
6363
});
6464

@@ -91,7 +91,7 @@ function Progress(runner, options) {
9191
// and the failures if any
9292
runner.once(EVENT_RUN_END, function() {
9393
cursor.show();
94-
console.log();
94+
process.stdout.write('\n');
9595
self.epilogue();
9696
});
9797
}

lib/reporters/spec.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,24 +46,24 @@ function Spec(runner, options) {
4646
}
4747

4848
runner.on(EVENT_RUN_BEGIN, function() {
49-
console.log();
49+
Base.consoleLog();
5050
});
5151

5252
runner.on(EVENT_SUITE_BEGIN, function(suite) {
5353
++indents;
54-
console.log(color('suite', '%s%s'), indent(), suite.title);
54+
Base.consoleLog(color('suite', '%s%s'), indent(), suite.title);
5555
});
5656

5757
runner.on(EVENT_SUITE_END, function() {
5858
--indents;
5959
if (indents === 1) {
60-
console.log();
60+
Base.consoleLog();
6161
}
6262
});
6363

6464
runner.on(EVENT_TEST_PENDING, function(test) {
6565
var fmt = indent() + color('pending', ' - %s');
66-
console.log(fmt, test.title);
66+
Base.consoleLog(fmt, test.title);
6767
});
6868

6969
runner.on(EVENT_TEST_PASS, function(test) {
@@ -73,19 +73,19 @@ function Spec(runner, options) {
7373
indent() +
7474
color('checkmark', ' ' + Base.symbols.ok) +
7575
color('pass', ' %s');
76-
console.log(fmt, test.title);
76+
Base.consoleLog(fmt, test.title);
7777
} else {
7878
fmt =
7979
indent() +
8080
color('checkmark', ' ' + Base.symbols.ok) +
8181
color('pass', ' %s') +
8282
color(test.speed, ' (%dms)');
83-
console.log(fmt, test.title, test.duration);
83+
Base.consoleLog(fmt, test.title, test.duration);
8484
}
8585
});
8686

8787
runner.on(EVENT_TEST_FAIL, function(test) {
88-
console.log(indent() + color('fail', ' %d) %s'), ++n, test.title);
88+
Base.consoleLog(indent() + color('fail', ' %d) %s'), ++n, test.title);
8989
});
9090

9191
runner.once(EVENT_RUN_END, self.epilogue.bind(self));

lib/reporters/xunit.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ XUnit.prototype.write = function(line) {
142142
} else if (typeof process === 'object' && process.stdout) {
143143
process.stdout.write(line + '\n');
144144
} else {
145-
console.log(line);
145+
Base.consoleLog(line);
146146
}
147147
};
148148

test/reporters/base.spec.js

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ var chai = require('chai');
55
var sinon = require('sinon');
66
var helpers = require('./helpers');
77
var reporters = require('../../').reporters;
8-
98
var AssertionError = assert.AssertionError;
109
var Base = reporters.Base;
1110
var chaiExpect = chai.expect;
@@ -417,4 +416,27 @@ describe('Base reporter', function() {
417416
var errOut = stdout.join('\n').trim();
418417
expect(errOut, 'to be', '1) test title:\n Error\n foo\n bar');
419418
});
419+
420+
describe('when reporter output immune to user test changes', function() {
421+
var sandbox;
422+
var baseConsoleLog;
423+
424+
beforeEach(function() {
425+
sandbox = sinon.createSandbox();
426+
sandbox.stub(console, 'log');
427+
baseConsoleLog = sandbox.stub(Base, 'consoleLog');
428+
});
429+
430+
it('should let you stub out console.log without effecting reporters output', function() {
431+
Base.list([]);
432+
baseConsoleLog.restore();
433+
434+
expect(baseConsoleLog, 'was called');
435+
expect(console.log, 'was not called');
436+
});
437+
438+
afterEach(function() {
439+
sandbox.restore();
440+
});
441+
});
420442
});

0 commit comments

Comments
 (0)