我正在尝试使用替换特定的软件包
import Module from 'module';
const {require: oldRequire} = Module.prototype;
Module.prototype.require = function twilioRequire(file) {
if (file === 'the-package-of-interest) {
// return something else
}
return oldRequire.apply(this, arguments);
};
const p = require('the-package-of-interest');
// this gives me the replacement
这可以很好地工作,但是如果将其放置在生成另一个脚本的脚本中,则不能在另一个脚本中使用,即
// main.js
import Module from 'module';
import spawn from 'cross-spawn';
const {require: oldRequire} = Module.prototype;
Module.prototype.require = function twilioRequire(file) {
if (file === 'the-package-of-interest) {
// return something else
}
return oldRequire.apply(this, arguments);
};
spawn.sync('node', ['/path/to/another/script.js'], { stdio: "inherit" });
// another/script.js
require('the-package-of-interest');
// gives the original package, not the replacement
我不认为有一种方法可以生成另一个脚本,但是保持被劫持的require
范围不变吗?
答案 0 :(得分:0)
即使在测试中通常使用模拟库,但这也是对基于配置与另一个库或文件进行存根的一个好情况。
有很多用于节点的模拟库,并且有一篇不错的文章which covers some of them。
library it recommends很好,但是您可以使用任何想要的方法
首先-定义您的模拟。您可以在任何地方进行设置,这只是一个设置。 最简单的方法是在同一文件中执行此操作,但是您可以根据需要创建模拟定义文件
import rewiremock from 'rewiremock';
...
// by mocking the module library, you actually replace it everywhere
rewiremock('module')
.with(otherModule);
您的其他模块需要具有相同的导出功能,才能正常工作并以相同的界面操作。
要使用,您需要某种条件,这些条件将选择是使用原始库还是第二个库
// This is only needed if you put the mock definitions in another file
// Just put the rest of the code under the previous snippter
// if everything is in the same file
require('<your_rewiremock_definitions_file>');
if (replaceImport) {
rewiremock.enable();
}
// run the code here
if (replaceImport) {
rewiremock.disabled();
}
您的模块应该随处都被第二个模块替换。
您可以使用任何其他模拟库来执行此操作。如果您想使用其他样式或其他库,start of the readme上会有一小段带有不同的选项。
rewiremock
通过替换node.js缓存来工作,因此它应该在各处更改依赖项。