我有一个带有单个匿名函数的js文件,没有导出或分配给module.exports。我无法更改此文件。但我需要能够测试它。如何将此文件导入/导入测试?
例如。
myScript.js(无法修改)
/*
* Documentation for function
*
*/
function (param1, cb) {
cb(param1);
}
myScript.test.js
// How can I get this anonymous function here?
const myScript = require('./myScript');
已完成的一个选项是将myScript.js
作为文件读取,删除注释并使用Function.apply
将代码作为字符串。这感觉就像一个hacky方法,所以我正在寻找CommonJS等区域中是否有任何可以解决此限制的事情。
答案 0 :(得分:0)
如果您使用的是webpack
,则可以使用string-replace-loader来解决此问题。
这也很hacky,但更少:)
webpack.config.js
module.exports = {
module: {
rules: [
{
include: [path.resolve(__dirname, 'src')],
loader: 'string-replace-loader',
options: {
search: 'function (param1, cb)',
replace: 'module.exports.myfunc = function (param1, cb)',
},
test: /myScript\.js$/
}
]
}
}
src / index.js
var myScript = require("./myScript")
myScript.myfunc("myParam", (p)=>console.log("callback hit with param ", p));
cmd
$ webpack
$ node dist/main.js
callback hit with param myParam
当然,如果要执行以下操作:
myScript=require('./myScript');
myScript(...)
在替换中使用此名称:module.exports = function (param1, cb)
答案 1 :(得分:0)
您可以这样做:
var fileContents;
//TODO: load in contents of your JS file here (no need to strip comments)
var expr = '(function(){ return ' + fileContents + '; })()';
module.exports = eval(expr);
顺便说一句,当您认为加载和评估文件内容是其最初的预期用途时,这并不是一个“ hack”。