使用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. Linux字符界面下用户账户的设置

    在Linux系统字符界面下创建.修改以及删除用户账户主要使用useradd,usermod和userdel这3个命令. 一.创建用户账户 创建用户账户就是在系统中创建一个新账户,然后为新账户分配用户U ...

  2. 纸上谈兵:栈(stack)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 栈(stack)是简单的数据结构,但在计算机中使用广泛.它是有序的元素集合.栈最显 ...

  3. 第五百八十二天 how can I 坚持

    好吧,是我错了,昨天,做好自己就行了,别人怎么样是别人的事,永远保持一颗单纯向上的心. 时间过得真快,明天又周六了.. 睡觉.

  4. 调用Ria Service中方法的各种方式

    前端界面后台: using System; using System.Collections.Generic; using System.Linq; using System.Net; using S ...

  5. oracle replace函数

    replace 函数用法如下: replace('将要更改的字符串','被替换掉的字符串','替换字符串') 例如: select t.dqsj,replace(t.dqsj,'16:40','16: ...

  6. Modbus协议

    总体上来说,发送命令格式如下:模块号(1字节)功能码 起始地址(2字节)   数据(X字节) CRC(2位) 模块号(1字节)功能码(要读取的寄存器,读 01,设置05,Coil Status/Inp ...

  7. args

    java 中args一般存在main主类方法内,String args[ ]或者String[ ] args表示给主方法传一个字符串数组. 而args是一个字符串数组的变量名,不是关键字,是argum ...

  8. 如何使用本地yum源?

    首先为大家介绍在Centos系统上如何利用系统光盘/镜像作为yum源,实现程序包的安装等操作 1.首先在VM虚拟机上确保已载入光盘镜像,载入成功后显示如下效果. 2.挂载光盘镜像文件,使用命令: mo ...

  9. 比较两个Long对象值

    比较两个Long对象的值是否相等,不可以使用双等号进行比较,(long int Integer可以用双等号进行比较)可以采用如下方式: 1.使用equals方法进行比较 Long a=new Long ...

  10. win7 64位 mongodb2.6.0 安装服务启动

    Workaround to install as a service You can manually install 2.6.0 as a service on Windows from an Ad ...