`

用karma对基于cmd(seajs)的前端代码进行单元测试

 
阅读更多

近期做前端单元测试,因为用了seajs,项目中很多定义了匿名的cmd(根据文件名、路径加载),但在用karma测试的过程中遇到了点麻烦,这个blog就总结下解决的问题。

 

1. 首先要先了解下karma的script加载方式

    在karma.conf.js的配置里files都会以<script>标签加载在karma的context.html页面上(即测试页面中)。所以我们要测试的依赖文件、单元测试文件都要写在files里。karma提供了以/base /absolute开头的url路径访问files。所以我们在files里配置的路径,对应karma的浏览器路径就是

/base/yourfile.js

(因为对karma了解得还很少,所以有错误的地方童鞋请指出)

 

2. 要解决匿名cmd的问题

    如果你有一个file,例子a.js,里面这么定义

 

// a.js
define(function(require, exports, module){
	****
});

 

 

   另一个b.js里这么引用require('/absolutepath/a.js')

 

在karma里就出现问题了,因为karma引入<script file="a.js">执行下,对于seajs来说只是定义一个匿名的cmd,真正用的时候,路径就变成了/base/a.js。所以b.js在运行时候会找不到a——测试不能修改已经完成的开发的代码。

为了解决这个,思路可以有两个

    a) 第一就是在测试时候动态修改b.js,修改require的路径,这个不合适,因为有的是引用了已经定义好name的cmd,而不是用路径。无法做到一致修改。

    b) 第二个就是把匿名的cmd,在karma里变成用路径作为其name的cmd——百度之,有一个karma-commonjs的plugin,看了下不适合,但给了思路,用preprocessor,所以模仿写一个,就是替换define(function{而已

 

 

var createPreprocesor = function(basePath, logger) {
  var log = logger.create('preprocessor.commonjs');

  return function(content, file, done) {
	var pat = /(define *\(( *function.+))/;
	var mat = pat.exec(content);
    if (!mat) {
      return done(content);
    }

	var id = file.path.replace(basePath, '');
    var output = content.replace(mat[1], "define('" + id + "'," + mat[2]);

    done(output);
  };
};

createPreprocesor.$inject = ['config.basePath', 'logger'];

// PUBLISH DI MODULE
module.exports = {
  'preprocessor:commonjs': ['factory', createPreprocesor]
};

 

 

这样原本的a.js就变成了

 

// a.js
define('/js/a.js', function(require, exports, module){
	****
});

 

 

3. 需要对cmd的name进行重新定义——由于这个preprocessor写得很简单,就是把file path相对basePath的路径做为cmd的name。所以还是解决不了b.js以相对路径引入a.js的问题。

 

重新定义了还有个必要性就是b.js即便用绝对路径引入了a.js,但如果测试代码依赖需要b.js的执行完成,b.js用seajs的load /base/js/a.js,会出现不同步问题。seajs.use('/js/b.js')虽然执行完下了,b.js里的内容还没执行完,测试内容执行就报错了。

 

所以karma的files再增加一个这样的file

 

// redefine
seajs.use('/js/a.js', function(obj){
	// obj is a function
	/*
	define('a.js', function(){
		return obj;
	});
	*/
	define('a.js', obj);
});

 

 

到此位置就基本上可以测试大多数物理文件上分散的seajs的文件了,如果有require嵌套很深的,就要有多个这样的redefine.js,加载顺序还要固定。

 

具体的测试代码大概是这样的

 

 

seajs.use('/js/b.js');

describe('Test http', function() {
	describe('MyCtrl',function(){
		beforeEach(module('md'));
		var scope, ctrl;
		beforeEach(inject(function($rootScope, $controller){
			scope = $rootScope.$new();
			ctrl = $controller('MyCtrl',{$scope: scope});
		}));
		it('init data', function(){
			expect(scope.val).toBe('123');
		});
	});
});

 

 

 

 

 

0
0
分享到:
评论

相关推荐

    karma单元测试代码(全)

    总结,本资源提供的Karma和Jasmine集成的单元测试代码,对于理解如何有效地进行JavaScript单元测试非常有帮助。通过学习和实践这些例子,开发者能够掌握测试驱动开发的理念,提升代码质量和维护性。

    软件测试-基于karma+webpack实现的vue单元测试框架.zip

    Vue.js作为一款流行的前端框架,其应用广泛,而对Vue组件进行单元测试则可以提高代码的健壮性和可靠性。本教程将深入探讨如何利用Karma和Webpack来构建一个针对Vue项目的单元测试框架。 1. **Karma**:Karma是一款...

    前端自动化测试示例代码

    Grunt插件如`grunt-contrib-jshint`用于执行JavaScript代码的语法检查,`grunt-karma`则可以配合Karma测试运行器进行前端测试。 在前端自动化测试中,我们通常会使用Mocha作为测试框架,Chai作为断言库,Sinon用于...

    angular-unit-testing:关于如何使用 Karma 和 MochaJasmine 对 AngularJS 前端进行单元测试的代码示例

    在前端开发中,单元测试是确保代码质量与稳定性的关键环节。AngularJS 是一个非常流行的JavaScript框架,用于构建复杂的单页应用(SPA)。本篇文章将深入探讨如何利用 Karma、Mocha 和 Jasmine 这些工具对AngularJS...

    Karma和Jasmine自动化单元测试

    Karma和Jasmine自动化单元测试

    前端开源库-karma-ceri

    **使用Karma-Ceri进行前端单元测试的步骤:** 1. **安装**:首先通过npm(Node.js包管理器)安装Karma-Ceri及其依赖,如`karma`, `karma-ceri`等。 2. **配置**:根据项目需求,对Ceri提供的默认配置进行适当的...

    karma-jasmine-typescript:使用Karma,Jasmine和Typescript进行单元测试的样本

    本项目"Karma-Jasmine-Ts"提供了一个使用Karma、Jasmine和TypeScript进行单元测试的示例,这对于熟悉这些工具的新手开发者尤其有帮助。让我们深入探讨每个组件以及它们如何协同工作。 **Karma** Karma,也被称为...

    前端开源库-karma-rollup-plugin

    总结来说,Karma Rollup Plugin 是前端开发中的一个重要工具,它让开发者能够在Karma测试环境中充分利用Rollup的代码优化能力,提高测试效率和质量。对于大型和复杂的JavaScript项目,这种集成可以带来显著的性能...

    使用Jasmine和Karma对AngularJS页面程序进行测试

    本文将详细介绍如何使用Jasmine测试框架和Karma测试运行器对AngularJS页面程序进行测试。 首先,需要了解什么是Jasmine和Karma。Jasmine是一个行为驱动开发(BDD)的框架,它不需要依赖DOM,因此特别适用于...

    前端开源库-karma-fixture

    在Karma的基础上,`karma-fixture`是一个非常实用的插件,专门用于加载`.html`和`.json`格式的fixture文件,以辅助进行前端单元测试。 Fixture在测试中通常指的是模拟数据或环境,它为测试提供了稳定的输入,使得...

    前端开源库-karma-chai-dom

    总的来说,"前端开源库-karma-chai-dom"是前端开发中一个重要的测试工具,它将Karma的强大测试运行能力与Chai的断言功能相结合,特别为DOM操作提供了便利,对于任何进行前端开发并重视测试的人来说都是一个非常有...

    前端开源库-karma-sonarqube-unit-reporter

    "前端开源库-karma-sonarqube-unit-reporter" 提供了一种有效的方法来管理和评估前端代码的单元测试。这个开源工具是专门为Karma设计的一个插件,其目的是将测试结果以SonarQube兼容的XML格式报告,以便于集成到...

    前端开源库-karma-beep-reporter

    总的来说,"karma-beep-reporter"是一个实用的前端开发辅助工具,它通过声音反馈测试结果,使开发者能够更加专注地进行代码编写,而不必频繁查看终端输出。结合Karma的其他功能,它可以帮助我们构建更健壮、更可靠的...

    前端开源库-komet-karma

    Komet-Karma就是这样一个专为Komet预设的前端测试框架,它整合了Karma,一个广受欢迎的JavaScript测试运行器,为开发者提供了一种高效、便捷的方式来组织和执行前端应用的单元测试。 **Karma测试运行器** Karma,...

    使用Karma做vue组件单元测试的实现

    在开发Vue应用时,进行单元测试是确保代码质量和可维护性的重要步骤。Karma作为一款流行的JavaScript测试运行器,能够帮助我们轻松地管理和执行单元测试。这篇内容将深入讲解如何利用Karma设置和执行Vue组件的单元...

    AngularJS-Unit-Testing:使用Karma和Jasmine的AngularJS单元测试和代码覆盖率

    一个简单的AngularJS MVC单页应用程序,使用Karma和Jasmine进行单元测试和代码覆盖。 自jQuery以来,AngularJS是JavaScript发生的最好的事情。 这就是JavaScript开发一直希望做到的。 Angular的主要优势之一是它的...

    单元测试的代码覆盖率统计.docx

    单元测试的代码覆盖率统计 单元测试的代码覆盖率统计是衡量测试用例好坏的一个方法,尤其是在多人合作的情况下,它可以在后期维护时候牵一发而动全身的代码修改中起到至关重要的检测作用。代码覆盖率统计可以从四个...

    前端开源库-karma-tape-reporter

    为了高效地进行单元测试,开发者通常会使用各种工具和框架。`karma-tape-reporter`是一个专门针对前端项目的开源库,它作为Karma测试运行器的一个插件,用于生成TAP(Test Anything Protocol)格式的测试报告。 ...

    前端开源库-karma-teamcity-reporter

    Karma 是一款广泛使用的 JavaScript 测试运行器,它允许开发者在多种浏览器环境下运行测试,确保代码的兼容性和可靠性。而 Karma Teamcity Reporter 则是 Karma 的一个插件,专门设计用于向 TeamCity CI 系统发送...

    前端开源库-karma-should

    在实际项目中,结合其他Karma插件如代码覆盖率工具,可以实现全面的前端单元测试和集成测试,确保项目的质量和稳定性。 总之,`karma-should`是前端开发中一个优秀的测试增强工具,它将`should.js`的简洁链式断言...

Global site tag (gtag.js) - Google Analytics