使用Karma测试Angular组件时如何替代<script>标签功能?
解决Karma测试中配置外部库全局对象的问题
Hi Thomas,
要在Karma测试中复现你在index.html里的配置效果(先设置全局配置对象,再加载依赖它的外部脚本),可以通过以下两种可靠的方式实现:
方法一:使用单独的配置脚本文件(推荐)
这种方式更清晰,适合全局复用配置:
- 创建测试配置脚本
在你的项目中新建一个专门的测试初始化文件,比如src/test/setup-external-library.js,内容就是你的全局配置对象:
window.myExternalLibraryConfigurationObject = { // 这里放你的配置键值对,和index.html里的一致 };
- 修改karma.conf.js的files数组
把这个本地配置脚本放在外部库脚本的前面(Karma会按数组顺序加载文件),确保配置对象先被创建,再加载依赖它的外部库:
module.exports = function(config) { config.set({ // 其他配置... files: [ // 先加载全局配置脚本 'src/test/setup-external-library.js', // 再加载外部库 'https://my-internal-repository.com/widgets/my-external-library/my-widget.js', // 你的测试文件和其他依赖... ], // 其他配置... }); };
方法二:直接在karma.conf.js中注入内联脚本
如果你的配置比较简单,也可以不用单独文件,直接在files数组中添加内联脚本:
module.exports = function(config) { config.set({ // 其他配置... files: [ // 内联配置脚本,用`data:text/javascript,...`格式 { pattern: 'data:text/javascript,window.myExternalLibraryConfigurationObject = { /* 你的配置 */ };', watched: false, // 不需要监听这个内联脚本的变化 included: true, // 要注入到测试环境中 served: true }, // 再加载外部库 'https://my-internal-repository.com/widgets/my-external-library/my-widget.js', // 你的测试文件... ], // 其他配置... }); };
关键注意点
- 加载顺序是核心:必须保证全局配置对象在外部库脚本之前被定义,否则外部库初始化时找不到这个对象会报错。
- 如果你的测试是异步加载组件的,也要确保在组件初始化前,配置对象和外部库都已经加载完成(Karma的files默认是同步加载的,所以只要顺序对就没问题)。
这样配置后,你的Karma测试环境就和浏览器里通过index.html注入的环境一致了,组件就能正常依赖外部库运行啦!
内容的提问来源于stack exchange,提问作者Thomas Perez
相关产品推荐
相关产品推荐

