我正在自动运行 ECMA-402 test suite针对我编写的 Intl
polyfill,我遇到了一些问题。目前,测试是针对库的完整版本运行的,这意味着每次进行更改时都必须重新编译才能运行测试。我试图通过将代码拆分为单独的模块并使用 require 来运行测试来改进它。
当我尝试使用 vm
模块运行测试时,主要问题就出现了。如果我将 polyfill 添加到测试的沙箱中,一些测试会在检查 native 行为时失败——例如,polyfill 的对象不会从测试上下文的 Object.prototype
继承。将 require
传递给测试将不起作用,因为模块仍在父上下文中编译和执行。
在我看来最简单的解决方案是生成一个新的 Node 进程并将代码写入进程的 stdin
,但是生成的 node
进程不执行代码写入它并永远等待。这是我试过的代码:
function runTest(testPath, cb) {
var test,
err = '',
content = 'var IntlPolyfill = require("' + LIB_PATH + '");\n';
content += LIBS.fs.readFileSync(LIBS.path.resolve(TEST_DIR, testPath)).toString();
content += 'runner();';
test = LIBS.spawn(process.execPath, process.execArgv);
test.stdin.write(content, 'utf8');
// cb runs the next test
test.on('exit', cb);
}
有没有人知道为什么 Node.js 不执行写入其 stdin
流的代码,或者如果有其他方法我可以让模块在与测试相同的上下文中编译?
最佳答案
您必须关闭子进程的标准输入才能使用数据并退出。完成代码传递后执行此操作。
test.stdin.end();
关于javascript - 在沙箱中执行代码,模块在相同的上下文中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23932876/