这是一个简单的例子,说明了我的问题的关键:
var innerLib = require('./path/to/innerLib');
function underTest() {
return innerLib.doComplexStuff();
}
module.exports = underTest;
Run Code Online (Sandbox Code Playgroud)
我正在尝试为此代码编写单元测试.如何在innerLib不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;
}
};
Run Code Online (Sandbox Code Playgroud)
问题是requireunderTest.js文件中的函数实际上没有被模拟出来.它仍然指向全球require功能.所以我似乎只能underTest.js在同一个文件中模拟我正在进行模拟的函数.如果我使用全局require来包含任何内容,即使在我重写本地副本之后,所需的文件仍将具有全局require引用.
我正在尝试使用webpack + traceur来调用Ecmascript 6模块来转换为ES5 CommonJS,但是我无法成功地对它们进行单元测试.
我尝试使用Jest + traceur预处理器,但自动插件和依赖名称似乎变得棘手,而且我似乎无法使用sourceMaps来使用Jest和node-inspector调试.
是否有更好的单元测试ES6模块框架?
如果没有,首先,我会全力以赴编写我的所有模块
import A from './a.js';
var B = function(){
//use A
};
export default B;
Run Code Online (Sandbox Code Playgroud)
然后使用编译器将其构建为某种浏览器或服务器格式.
然而,我的一个问题与上面的明确规范./a.js中import.
我理解为什么规范这样做1,赞成静态分析.但是有两个非常实际的原因可以解释为什么在模块的文件名和路径中烘焙都很麻烦.
import myModule from './../../vendor/lib/dist/mod.js'到模块的代码中并不能完全让我感到前瞻性.除了路径本身,指定文件名也会让你失望.像这样的东西似乎是无辜的:
import $ from 'vendor/jquery.js'
但是,当我想使用Zepto而不是jQuery时呢?我发现抽象,尤其是供应商库的抽象,在处理大型代码库,自以为是的开发人员和不断变化的JavaScript生态系统时非常有用.我今天可能想要将React导入我的组件库,但明天呢?如果我要在客户端和服务器上使用相同的模块,但是我需要不同版本的依赖库,该怎么办?
我在团队中坚持强大(但清晰且一致)的抽象.通常,抽象采取某种命名空间的形式.我幻想一下这个:
//BAD: Bakes React into my component modules
import ComponentLib from './React.js';
//GOOD: Leaves me free to use any React-like library
import ComponentLib from 'vendor.lib.component';
Run Code Online (Sandbox Code Playgroud)
其中 …
javascript ×3
ecmascript-6 ×2
jestjs ×1
mocking ×1
module ×1
node.js ×1
traceur ×1
unit-testing ×1