当前位置: 首页 > 面试题库 >

如何对需要其他模块的Node.js模块进行单元测试,以及如何模拟全局require函数?

周辉
2023-03-14
问题内容

这是一个简单的示例,它说明了我的问题的症结所在:

var innerLib = require('./path/to/innerLib');

function underTest() {
    return innerLib.doComplexStuff();
}

module.exports = underTest;

我正在尝试为此代码编写单元测试。如何在innerLibrequire完全嘲笑功能的情况下嘲笑对的要求?

因此,这是我试图模拟全局变量,require并发现即使这样做也不起作用:

var path = require('path'),
    vm = require('vm'),
    fs = require('fs'),
    indexPath = path.join(__dirname, './underTest');

var globalRequire = require;

require = function(name) {
    console.log('require: ' + name);
    switch(name) {
        case 'connect':
        case indexPath:
            return globalRequire(name);
            break;
    }
};

问题在于文件require内部的功能underTest.js实际上尚未被模拟。它仍然指向全局require功能。因此,看来我只能require在进行模拟的同一个文件中模拟出该函数。如果我使用全局require来包含任何内容,即使在覆盖本地副本之后,所需的文件仍将具有全球require参考。


问题答案:

您现在可以!

我发布了proxyquire,它将在测试模块时覆盖模块内部的全局需求。

这意味着您无需 更改代码 即可为所需模块注入模拟。

Proxyquire有一个非常简单的api,它可以解析您要测试的模块,并通过一个简单的步骤传递其所需模块的模拟/存根。

@Raynos是正确的,传统上,您必须诉诸不太理想的解决方案才能实现该目标或进行自下而上的开发

这就是我创建proxyquire的主要原因-允许自上而下的测试驱动开发而无任何麻烦。

请查看文档和示例,以判断它是否适合您的需求。



 类似资料:
  • 问题内容: 我有一段代码,我不知道如何进行单元测试!该模块使用urllib2从外部XML提要(twitter,flickr,youtube等)中提取内容。这是一些伪代码: 我的第一个想法是腌制响应并加载它以进行测试,但是显然urllib的响应对象是不可序列化的(它引发了异常)。 仅从响应主体保存XML是不理想的,因为我的代码也使用标头信息。它旨在作用于响应对象。 当然,在单元测试中依赖外部数据源是

  • 我有一个示例方法(我需要编写测试用例)如下所示, 我想模拟getConfig方法并返回一个特定的字符串值。getConfig是Kotlin对象中方法,如下所示, 下面是我尝试的测试 我没有得到任何错误,但是getConfig方法没有被嘲笑。执行实际的实现。我也试过使用Powermockito。请帮帮我

  • 我试图将单元测试框架(JEST)添加到用AMD编写的遗留JavaScript代码库中。当需要添加模块时,NodeJs会触发一个错误。 以下是JavaScript AMD: 以下是测试文件: 以下是错误: 测试套件无法运行 无法将模块分配给与当前文件不同的id● 测试套件无法运行

  • 问题内容: 假设我需要一个模块并执行以下操作: 然后,我要拿走模块b(即清理缓存)。我该怎么办? 原因是我想动态加载/删除或更新模块,而无需重新启动节点服务器。任何想法? -------更多--------根据删除require.cache的建议,它仍然不起作用… 但是,当我呼叫b时,它仍然存在!它仍然可以访问。除非我这样做: 不知道这是否是处理该问题的好方法。因为如果以后再修改b.js,我又需要