我的问题是使用Mocha对javascript代码进行单元测试。最终这可能是关于依赖注入或控制反转的问题,我对这些概念的掌握很差。
我正在尝试编写一个测试,它只是创建一个header.js实例并测试它是一个对象。但是,无论何时我这样做,我的测试在加载Modernizr时会爆炸,并显示以下错误消息。似乎是因为Modernizr依赖于在浏览器中运行,但我的单元测试需要在命令行上运行。
/lib/modernizr.js:8
l.style中的“MozAppearance”,s = r&& !! b.createRange()。compareNode,t = s?l:n.parentNod ^ TypeError:无法读取未定义的属性“parentNode” at /Users/devadmin/devenv/djscript/djscript-vendor/lib/modernizr.js:8:6291
我有一些requirejs模块,它们在以下层次结构中:
lib
└── pj
├── module
│ └── header
│ └── header.js
├── util
│ └── header
│ └── Util.js
└── widget
└── header
├── Header.js
└── view
├── HeaderView.js
└── NavView.js
header.js实例化Header.js,后者又创建了HeaderView和NavView。只有HeaderView需要Modernizr。
有关如何将此代码置于可测试状态的任何提示?看看我如何打包Modernizr与requirejs一起使用会有帮助吗?
答案 0 :(得分:2)
好吧,我没有专门使用过Mocha,但是你应该能够通过做类似的事情在你的测试/工具中创建一个假的Modernizr实例。
define(<module path/name - e.g. 'libs/modernizr'>, function(){
return {
history: false,
foo: true,
bar: false
};
});
...在您尝试加载测试模块之前。在定义了假实例的情况下,您测试的模块应该使用伪造而不是实际的modernizr lib。
你基本上是在劫持AMD的“命名模块”(链接:http://requirejs.org/docs/api.html#modulename)功能,用真假替换真正的现代化。通过这种方式,您可以明确地测试您需要的任何状态。
希望它有所帮助!