node.js: любой способ экспортировать ВСЕ функции в массиве файлов (например, чтобы включить модульное тестирование), по сравнению с одной за другой. - PullRequest
23 голосов
/ 03 февраля 2012

в node.js, есть ли ярлык для экспорта ВСЕХ функций в данный файл?я хочу сделать это для целей модульного тестирования, так как мои модульные тесты находятся в отдельном файле от моего производственного кода.

Я знаю, что могу пройти и экспортировать каждую функцию вручную, например:

exports.myFunction = myFunction;

Но мне интересно, есть ли более простой / изящный способ сделать это.

(и да, я понимаю, по соображениям модульности не всегда хорошая идея экспортировать все функции, но для целей модульного тестирования вы действительно хотите увидеть все маленькие функции, чтобы вы могли тестировать их по частям.)

Спасибо!

Ответы [ 3 ]

16 голосов
/ 03 февраля 2012

Вы можете сделать что-то вроде этого:

// save this into a variable, so it can be used reliably in other contexts
var self = this;

// the scope of the file is the `exports` object, so `this === self === exports`
self.fnName = function () { ... }

// call it the same way
self.fnName();

Или это:

// You can declare your exported functions here
var file = module.exports = {
  fn1: function () {
    // do stuff...
  },
  fn2: function () {
    // do stuff...
  }
}

// and use them like this in the file as well
file.fn1();

Или это:

// each function is declared like this. Have to watch for typeos, as we're typing fnName twice
fnName = exports.fnName = function () { ... }

// now you can use them as file-scoped functions, rather than as properties of an object
fnName();
0 голосов
/ 20 сентября 2017

Вот простой способ сделать это. Проанализируйте AST, найдите определения функций верхнего уровня и экспортируйте их.

const esprima = require('esprima')
const program = fs.readFileSync(__filename,'utf8')
const parsed = esprima.parseScript(program)
for (let fn of parsed.body) {
  if (fn.type.endsWith('FunctionDeclaration')) {
    module.exports[fn.id.name] = eval(fn.id.name)
  }
}
0 голосов
/ 16 июня 2012

Mixin объекты является ответом.

Эта библиотека может помочь вам: https://github.com/shimondoodkin/nodejs-clone-extend

//file1.js

var _ = require('cloneextend');
_.extend(this, require('file2.js'));

file1.js теперь имеет все экспорты из file2.js

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...