diff --git a/Makefile b/Makefile index c4cefe8f2f..d6501ec33b 100644 --- a/Makefile +++ b/Makefile @@ -51,7 +51,8 @@ test-browser-tdd: test-jsapi: @printf "==> [Test :: JS API]\n" - node test/jsapi + node test/jsapi/index.js + node test/jsapi/cache/index.js test-unit: @printf "==> [Test :: Unit]\n" diff --git a/lib/mocha.js b/lib/mocha.js index a649715191..08030be332 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -99,6 +99,10 @@ function Mocha(options) { if (options.slow) { this.slow(options.slow); } + + // files which were in require.cache + // by the moment of mocha instance creation + this._requireCache = this._getRequireCache(); } /** @@ -220,6 +224,7 @@ Mocha.prototype.loadFiles = function(fn) { suite.emit('require', require(file), file, self); suite.emit('post-require', global, file, self); }); + this._flushRequireCache(); fn && fn(); }; @@ -246,6 +251,28 @@ Mocha.prototype._growl = function(runner, reporter) { }); }; +/** + * Get require.cache files (node only) + * + * @api private + */ +Mocha.prototype._getRequireCache = function() { + return Object.keys(require.cache || {}); +}; + +/** + * Flush test files from require.cache + * + * @api private + */ +Mocha.prototype._flushRequireCache = function() { + this._getRequireCache().forEach(function(filePath) { + if (this._requireCache.indexOf(filePath) === -1) { + delete require.cache[filePath]; + } + }, this); +}; + /** * Escape string and add it to grep as a regexp. * diff --git a/test/jsapi/cache/include.js b/test/jsapi/cache/include.js new file mode 100644 index 0000000000..ca83871e67 --- /dev/null +++ b/test/jsapi/cache/include.js @@ -0,0 +1,4 @@ +module.exports = function() { + global[__filename] = global[__filename] || 0; + global[__filename]++; +}; diff --git a/test/jsapi/cache/index.js b/test/jsapi/cache/index.js new file mode 100644 index 0000000000..eb9d8a562f --- /dev/null +++ b/test/jsapi/cache/index.js @@ -0,0 +1,20 @@ +var Mocha = require('../../../') + , assert = require('assert') + , path = require('path'); + +var testFile = path.resolve(__dirname, 'spec.js'); +var includeFile = path.resolve(__dirname, 'include.js'); + +var set1 = new Mocha(); +set1.addFile(testFile); + +var set2 = new Mocha(); +set2.addFile(testFile); + +set1.run(function () { + assert.strictEqual(global[includeFile], 1, 'JSAPI test #1 didn\'t run'); + + set2.run(function () { + assert.strictEqual(global[includeFile], 2, 'JSAPI test #2 didn\'t run'); + }); +}); diff --git a/test/jsapi/cache/spec.js b/test/jsapi/cache/spec.js new file mode 100644 index 0000000000..2a2345e505 --- /dev/null +++ b/test/jsapi/cache/spec.js @@ -0,0 +1,8 @@ +var path = require('path'); +var increment = require('./include'); + +describe('Mocha', function () { + it('should increment global counter', function () { + increment(); + }); +});