使用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. windows8.1+centos7双系统(装完centos后无win8引导)

    原先系统为windows8.1后来装上centos7后无win8系统引导, 打开电脑进入引导界面按C 进入grub界面  输入“cat (hd0,” 按tab可查看到windows8 地址为“hd0, ...

  2. php把错误日志输入到文件里。

    display_errors = On 开启状态下,若出现错误,则报错,出现错误提示 dispaly_errors = Off 关闭状态下,若出现错误,则提示:服务器错误.但是不会出现错误提示 log ...

  3. aspx中如何绑定llistbox数据列表

    DataTable dt = new DataTable(); dt = goodsbll.Get_prodtolist(_fatherpeoid,_sonpeoid).Tables[]; ) { f ...

  4. git branch 管理常用命令

    查看本地分支 git branch * dev master *代表当前位于dev分支 查看远程分支 git branch --remote origin/dev origin/master 查看远程 ...

  5. java学习第10天

    今天,下载了eclipse,终于不用在notepad里面敲了..好高兴=-=.下载安装eclipse就不用说了,去oracle官网下就好了,提醒一下,在所有路径中都不要有中文的出现..很能会有很多奇怪 ...

  6. C语言中的union

    1.union中可以定义多个成员,union的大小由最大的成员的大小决定. 2.union成员共享同一块大小的内存,一次只能使用其中的一个成员,与struct形成鲜明对比. 3.对某一个成员赋值,会覆 ...

  7. Autofac 的属性注入方式

    介绍 该篇文章通过一个简单的 ASP.NET MVC 项目进行介绍如何使用 autofac 及 autofac 的 MVC 模块进行依赖注入.注入方式通过构造函数.在编写 aufofac 的依赖注入代 ...

  8. LoadRunner ---手动关联与预关联

    手动关联                                       如果脚本很长,那么我们想找到一个脚本中哪些地方是需要关联的并不是一件容易的事情.这时,我们可以通过脚本对比的方法找 ...

  9. webform页面传值和删除修改

    一.webform跨页面传值1.内置对象地址栏数据拼接 QueryString 优点:简单好用:速度快:不消耗服务器内存. 缺点:只能传字符串:保密性差(调转页面后在地址栏显示):长度有限.响应请求对 ...

  10. Appium学习路-打包apk和ipa篇

    间隔这么长时间再去写Appium的学习篇是有原因的,因为在想要用appium测试ios时,发现appium只能测试debug版本的ipa包.然后就需要自己去学习打包了啊.然后就对xcode各种不了解, ...