这是一个简单的例子,说明了我的问题的症结:
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
参考。
你现在可以!
我发表了代理查询 https://npmjs.org/package/proxyquire当您测试模块时,它将负责覆盖模块内的全局需求。
这意味着你需要没有更改您的代码为了注入所需模块的模拟。
Proxyquire 有一个非常简单的 api,它允许解析您尝试测试的模块,并通过一个简单的步骤传递其所需模块的模拟/存根。
@Raynos 是对的,传统上你必须诉诸不太理想的解决方案才能实现这一目标,或者进行自下而上的开发
这就是我创建 proxyquire 的主要原因 - 允许自上而下的测试驱动开发,没有任何麻烦。
查看文档和示例,以确定它是否满足您的需求。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)