使用cordova、angularjs、ionic开发hybrid App有一段时间了。为了做单元测试,之前一直是把要测的某一部分产品代码复制到另一个单独的工程中来写测试代码,测好了以后再复制回去。弊端显而易见。于是就想,能不能在同一份产品代码上做单元测试呢?

  搜百度,结果千篇一律,而且语焉不详,一点实践意义都没有。还是谷歌好,给出了三篇非常具体的指导文章,请看附录。

一、我的工程概况

  因为是cordova工程,所以除了www之外还有别的很多目录,这里不一一列出。以下只看www目录:

+ www/

  + lib/      库根目录

    + angular/     放angular库

    + ionic/       放ionic库(一般已包含了angular库)

  + app/      app控制器、视图模板,按大功能块再分子目录

  + app.services/   app相关的service

  + app.directives/  app相关的directive

  + test/      测试代码根目录

    + lib/       测试用到的库

      + jasmine-2.4.1/    放jasmine库

      + angular/          放angular-mock等依赖项

    + spec/      测试用例

    SpecRunner.html  测试运行器页面

【注1】Jasmine库具体是哪些文件呢?请后参考资料:2. Jasmine独立包下载页面: https://github.com/jasmine/jasmine/releases

【注2】测试运行器页面 SpecRunner.html 也可以仿照 Jasmine库的示例来写,例如:

    <!-- jasmine -->
<link rel="shortcut icon" type="image/png" href="lib/jasmine-2.4.1/jasmine_favicon.png">
<link rel="stylesheet" href="lib/jasmine-2.4.1/jasmine.css">
<script src="lib/jasmine-2.4.1/jasmine.js"></script>
<script src="lib/jasmine-2.4.1/jasmine-html.js"></script>
<script src="lib/jasmine-2.4.1/boot.js"></script> <!-- angular -->
<script src="../lib/ionic/js/ionic.bundle.js"></script>
<script src="lib/angular/angular-mocks.js"></script> <title>测试运行器</title> <!-- 被测源码 -->
<script src="../app.services/constService.js"></script> <!-- 测试用例 -->
<script src="spec/app.services/constServiceSpec.js"></script>

【注3】test目录不需要出现在最终打包后的Android apk中,所以要排除掉,方法如下:

  找到cordova工程中platforms\android\ant.properties文件,添加一句:

aapt.ignore.assets=&lt;dir&gt;test:

相当于:

aapt.ignore.assets=<dir>test:

二、测试Service

假如www/app.services/目录下有个constService.js文件:

angular.module("app.services").service("constService", function(){

  this.one = 1;

});

现在编写测试Spec,文件名为constServiceSpec.js,位于www/test/spec/app.services/目录,内容如下:

describe("constService", function () {
var out; // 被测对象
beforeEach(function () {
module('app.services');   // 导入模块
     inject(function (constService) {   // 注入依赖
  out = constService; // 关联被测对象实例
})); it("one == 1", function () {
expect(out.one).toEqual(1);
});
});

然后在 SpecRunner.html中添加该Spec文件的引用:

    <!-- 测试用例 -->
<script src="spec/app.services/constServiceSpec.js"></script>

最后运行SpecRunner.html即可,输出如下:

三、测试Controller

待续...

参考资料:

  1. Jasmine官网: http://jasmine.github.io/
  2. Jasmine独立包下载页面: https://github.com/jasmine/jasmine/releases
  3. Unit Testing in AngularJS: Services, Controllers & Providers
  4. Mocking Dependencies in AngularJS Tests
  5. Unit Testing Services in AngularJS for Fun and for Profit

angularjs+jasmine单元测试入门的更多相关文章

  1. Android Studio单元测试入门

    Android Studio单元测试入门 通常在开发Android app的时候经常会写一些小函数并验证它是否运行正确,通常做法我们是把这个函数放到某个界面(Activity上)执行一下,运行整个工程 ...

  2. 不用搭环境的10分钟AngularJS指令简易入门01(含例子)

    不用搭环境的10分钟AngularJS指令简易入门01(含例子) `#不用搭环境系列AngularJS教程01,前端新手也可以轻松入坑~阅读本文大概需要10分钟~` AngularJS的指令是一大特色 ...

  3. AngularJS过滤器filter入门

    在开发中,经常会遇到这样的场景 如用户的性别分为“男”和“女”,在数据库中保存的值为1和0,用户在查看自己的性别时后端返回的值自然是1或0,前端要转换为“男”或“女”再显示出来: 如我要换个羽毛球拍, ...

  4. karma单元测试入门

    学习angularjs,都会遇到karma单元测试,可是初学者面对复杂的测试配置往往不知从何入手,下面我们将抛开angularjs,单独使用两个js文件,完成一次测试入门. 0,karma原理

  5. 爱上iOS单元测试系列之爱上她就要先了解她:单元测试入门

    前言 对于单元测试一开始我是拒绝的.单元测试是一个什么东东,因为我喜欢做iOS开发是因为喜欢写APP的啊,一切和这一目标不相干的东西我没兴趣啊,所以从事iOS开发几年都没去深入学习过单元测试(主要是之 ...

  6. 基于Angularjs+jasmine+karma的测试驱动开发(TDD)实例

    简介(摘自baidu) 测试驱动开发,英文全称Test-Driven Development,简称TDD,是一种不同于传统软件开发流程的新型的开发方法.它要求在编写某个功能的代码之前先编写测试代码,然 ...

  7. angularjs webstorm 单元测试 Package.json

    Package.json小结 生成package.json 定位到想放置package.json的目录,运行npm init,根据提示就可以生成package.json文件,其中test comman ...

  8. VS单元测试入门实践教程

    摘要:本教程不会介绍单元测试的基本理论知识,也不会和大家讨论在实际项目中是否需要写单元测试代码的问题.但是如果你此时想使用VS中的单元测试的工具来测试某个方法是否正确,可你又从来没真正实践过,那么本教 ...

  9. Jest 单元测试入门

    今天,我们要讲的是 Jest 单元测试的入门知识. 为何要进行单元测试? 在学习 Jest 之前,我们需要回答一个问题:为何要进行单元测试?编写单元测试可以给你带来很多好处: 将测试自动化,无需每次都 ...

随机推荐

  1. JQ怎么获取margin-left的值

    var margin =$("#Modules .list").css('marginLeft');

  2. IE请求访问的设置

    1:问题 目前有个项目采用AngularJs发送Restful风格的请求的方式来实现前后端的通信,测试人员在使用IE浏览器进行测试的时候发现,有时候请求发送不到后台,后来经查找发现是由于IE浏览器的默 ...

  3. tomacat启动慢

    tomcat目录下有多个工程,tomcat每次启动的时候都会去加载,删除不需要的工程,

  4. 判断 0 和 '' 以及 empty null false的关系

    if('safdasefasefasf'==0) { echo "该字符串转换为数字 等于 0 <br/>"; } //output:该字符串转换为数字 等于零. 这是 ...

  5. Egret Wing3 FTP使用方法

    FTP 挺实用的,不用自己去申请sinasea什么的免费空间来测试项目了. 添加FTP服务器配置 默认就行. 指定目录上传至FTP服务器 选择免费云测试空间.然后选择bin-release/web目录 ...

  6. IMoniker接口的成员

       

  7. Jenkins+Maven+Sonar系统持续集成环境部署以及配置

    一.Jenkins介绍以及安装 什么是持续集成?   随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题.尤其是近些年来,敏捷(Ag ...

  8. {CSDN}{英雄会}{反相互}

    思路: 给定一个字符串,求两个不重叠的字串,他们翻转互补.其中一个字符串可以是删掉最多两个字符的原字符串子串. 动态规划,由于可以对子串进行删除操作,我首先想到了LCS问题,但需要枚举所有的长度,这样 ...

  9. vc 中调用COM组件的方法

    需求:1.创建myCom.dll,该COM只有一个组件,两个接口:   IGetRes--方法Hello(),   IGetResEx--方法HelloEx() 2.在工程中导入组件或类型库  #im ...

  10. super

    [super] Return a proxy object that delegates method calls to a parent or sibling class of type. This ...