在使用Karma/Jasmine对Angular或Laravel应用程序进行单元测试时,您可能会遇到以下错误消息:ReferenceError: module is not defined。这是由于缺少必需的依赖项或未正确设置Karma/Jasmine配置导致的问题。
错误原因
该错误通常是因为Karma没有正确加载应用程序依赖项所致。在Angular和Laravel中,许多模块都是通过CommonJS模块系统进行导入和导出的。但是,Karma默认情况下不会加载这些模块,因此需要手动将它们添加到Karma配置中。
解决方案
1. 添加karma-commonjs插件
为了让Karma能够加载CommonJS模块,我们可以使用karma-commonjs
插件。要使用它,请按照以下步骤操作:
- 安装karma-commonjs插件:
npm install karma-commonjs --save-dev
- 在karma.conf.js文件中添加以下代码:
-------------- - ---------------- - ------------ -- --- ----------- ----------- ------------ -- --- ------ - -- --- -- ------- ---- ----- -------- ------- ---- --------- -------------------- --------- ------- -- --- -- -------------- - -- --- -- ------------ --- ---- -------- ------- -------------------- ------------- -- --- -- -- --- --- --
2. 添加browserify插件和babel插件
如果您的应用程序使用ES6模块而不是CommonJS模块,则可以使用karma-browserify
插件和karma-babel-preprocessor
插件将它们转换为CommonJS模块。要使用这些插件,请按照以下步骤操作:
- 安装karma-browserify和karma-babel-preprocessor插件:
npm install karma-browserify karma-babel-preprocessor --save-dev
- 在karma.conf.js文件中添加以下代码:
-------------- - ---------------- - ------------ -- --- ----------- ----------- -------------- -- --- ------ - -- --- -- ------- ---- ----- --- ------- ---- --------- -------------------- --------- ------- -- --- -- -------------- - -- --- -- ------------ --- ---- --- ------- -------------------- --------- -------------- -- --- -- -- --- --- --
然后,您需要在项目根目录创建配置文件.babelrc
,并添加以下内容:
- ---------- --------------------- -
这将确保Babel正确地将ES6模块转换为CommonJS模块。
示例代码
假设我们有一个Angular或Laravel应用程序,其中包含一个名为myModule
的CommonJS模块,它导出一个变量myVar
。为了在Karma/Jasmine中正确地加载和测试此模块,我们需要执行以下步骤:
- 安装
karma-commonjs
插件:npm install karma-commonjs --save-dev
- 在karma.conf.js文件中添加以下代码:
-------------- - ---------------- - ------------ ----------- ----------- ------------ ------ - -- --- --------- ---------------------- --------- ------- -- --- -- -------------- - -- --- ---------------------- ------------- -- --- -- -- --- --- --
- 创建一个名为myModule.spec.js的测试文件,并编写以下测试用例:
-------------------- -- -- - --- ------ ------------- -- - -- ---- --- ------ -------------- - ---------------------------- -- --- --- -------- ----- - --------------------- --- ---------- -- ------- - ----------------------------------------------------------- -------- ---------------------------------------------------------------------------------------