如何用Jasmine和RequireJS模拟dojox解决Karma测试依赖脚本错误?
我之前也碰到过几乎一模一样的问题,本质就是RequireJS的模块解析逻辑和Dojo的模块结构不对付——Dojo里那些语言文件用的".."是指向父目录(也就是dojox根目录),但RequireJS会把它当成一个要加载的单独模块文件,可dojox本身根本不是单个JS文件,自然就抛出脚本错误了。给你几个实用的解决办法:
方法一:用RequireJS的empty:语法映射空模块
因为那些依赖dojox的模块,其实只是需要一个dojox命名空间对象来挂载子模块(比如dojox.date),根本不需要它有实际逻辑。所以直接在你的test-main.js里配置:
requirejs.config({ // 保留你原来的baseUrl、paths等配置 map: { '*': { 'dojox': 'empty:' } } });
empty:是RequireJS的特殊标记,告诉它这个模块是空的,不用加载任何文件。这样当dojox/date/buddhist这类模块请求dojox时,RequireJS就不会去尝试加载不存在的文件了。
方法二:手动模拟dojox基础模块
如果有些模块需要dojox对象上的一些基础属性(比如极少数情况会用到的工具方法),你可以自己写个极简的模拟文件。比如在测试目录下新建mocks/dojox.js,内容如下:
define([], function() { // 确保全局有dojox对象,没有就创建一个空对象 window.dojox = window.dojox || {}; return window.dojox; });
然后在test-main.js的paths里加上映射:
requirejs.config({ paths: { // 其他已有的路径配置 'dojox': './mocks/dojox' } });
这样所有依赖dojox的模块都会加载这个模拟文件,拿到一个合法的dojox对象。
方法三:修改Dojo模块的依赖路径(不推荐)
如果实在没别的办法,你也可以直接改Dojo那些语言文件的依赖,把".."改成"dojox"。不过这种方法需要动Dojo源码,后续升级Dojo版本的时候还要重新修改,太麻烦,一般不建议这么做。
另外提醒一句:如果还有其他dojox子模块用到类似的目录级依赖,都可以用上面前两种方法处理,思路都是一致的——让RequireJS能找到一个合法的模块,不管是空的还是模拟的。
内容的提问来源于stack exchange,提问作者StudioTime

