Node.js: любой способ экспортировать ВСЕ функции в файл в массовом порядке (например, для включения модульного тестирования), один за другим
в node.js, есть ли ярлык для экспорта ВСЕХ функций в данный файл? Я хочу сделать это для тестирования модулей, так как мои модульные тесты находятся в отдельном файле из моего производственного кода.
Я знаю, что могу выполнять и экспортировать каждую функцию вручную, как в:
exports.myFunction = myFunction;
Но мне интересно, есть ли более простой /slicker способ сделать это.
(и да, я понимаю, по причинам модульности, не всегда хорошая идея экспортировать все функции, но для целей единичного тестирования вы хотите увидеть все маленькие функции, чтобы вы могли протестировать их по частям.)
Спасибо!
Ответы
Ответ 1
Вы можете сделать что-то вроде этого:
// 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();
Ответ 2
Объекты Mixin - это ответ.
Эта библиотека может вам помочь: https://github.com/shimondoodkin/nodejs-clone-extend
//file1.js
var _ = require('cloneextend');
_.extend(this, require('file2.js'));
file1.js теперь экспортирует все файлы из файла file2.js
Ответ 3
Вот простой способ сделать это. Разберите АСТ и найдите определения функций верхнего уровня и экспортируйте их.
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)
}
}