ÉDITER:
Le chargement d'un module à l'aide de vm
peut provoquer un comportement inattendu (par exemple, l' instanceof
opérateur ne travaille plus avec les objets créés dans un tel module car les prototypes globaux sont différents de ceux utilisés dans le module chargé normalement avec require
). Je n'utilise plus la technique ci-dessous et utilise à la place le module rewire . Cela fonctionne à merveille. Voici ma réponse originale:
Élaborer sur la réponse de srosh ...
Cela semble un peu hacky, mais j'ai écrit un simple module "test_utils.js" qui devrait vous permettre de faire ce que vous voulez sans avoir d'exportations conditionnelles dans vos modules d'application:
var Script = require('vm').Script,
fs = require('fs'),
path = require('path'),
mod = require('module');
exports.expose = function(filePath) {
filePath = path.resolve(__dirname, filePath);
var src = fs.readFileSync(filePath, 'utf8');
var context = {
parent: module.parent, paths: module.paths,
console: console, exports: {}};
context.module = context;
context.require = function (file){
return mod.prototype.require.call(context, file);};
(new Script(src)).runInNewContext(context);
return context;};
Il y a d'autres choses qui sont incluses dans l' module
objet global d'un module de nœud qui pourraient également avoir besoin d'aller dans lecontext
objet ci-dessus, mais c'est l'ensemble minimum dont j'ai besoin pour que cela fonctionne.
Voici un exemple utilisant le moka BDD:
var util = require('./test_utils.js'),
assert = require('assert');
var appModule = util.expose('/path/to/module/modName.js');
describe('appModule', function(){
it('should test notExposed', function(){
assert.equal(6, appModule.notExported(3));
});
});