微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

你现在可以!

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

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

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

@Raynos 是对的,传统上您必须求助于不太理想的解决方案才能实现这一目标,或者进行自下而上的开发

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

查看文档和示例,以确定它是否符合您的需求。

解决方法

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

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

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

module.exports = underTest;

我正在尝试为此代码编写单元测试。如何在不完全模拟函数的innerLib情况下模拟出对的要求require

所以这是我试图模拟全局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参考。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。