即使生成另一个脚本,劫持节点也需要

时间:2019-06-08 01:19:01

标签: javascript node.js

我正在尝试使用替换特定的软件包

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范围不变吗?

1 个答案:

答案 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缓存来工作,因此它应该在各处更改依赖项