AngularJS 单元测试(一)详解


Posted in Javascript onSeptember 21, 2016

AngularJS单元测试

网上有很多单元测试的教程,比如如何安装jasmine和ngMock,大家可以搜一下。这里就不在说了。下面重点介绍一个单元测试的过程。

加载一个模块

AngularJS用module来包括应用不同的部分比如controllers,services, filters。为了测试不同的部分,我们需要一个不同模块的引用,并且加载它。Angularjs模块注入使用ngMock模块。ngMock模块能够注入服务service进入单元测试。
ngMock暴露出angular.mock.module方法,缩写是module。

准备

需要准备的就是一个简单的AngularJS启动模块。

如何实现

 angular.mock.module方法被用在beforeEach方法中。这个module方法需要一个模块的名字或者另外一个字面量对象来替代,将会被注入。

1、使用一个字符串名字来代表模块

 beforeEach(module('services.emcees'))

2、添加字面量对象

beforeEach(module('services.emcees',{
 beatjunkies': {
  'dj': 'Babu'
 })
 })

3、现在可以在测试中使用beatjunkies引用检索解决的对象,返回{'dj': 'Babu'}

4、最后你也可以提供一个方法,提供一个rapper引用。

beforeEach(module('services.emcees'),{
 beatjunkies': {
  'dj': 'Babu'
 })
 },function($provider){
 $provider.value('rapper', 'madchild')
 })

写一个测试

例如这个例子,将要开始测试一个关于更改scope值来更新内容的指令。当scope上定义的一个noclick方法触发的时候这个值就会被分配。这需要在HTML上的按钮触发。

例如:

.directive('emcee',function(){
 return{
  restrict:'E',
  link:function(scope,element,attr){
   scope.onClick=function(){
    element.text('Step up ' + scope.emcee + '!')
   }
  }
 }

 })

具体做法

1、创建两个变量,一个用于scope(var scope),另一个用于element(var element)。

2、确定载入你的模块 beforeEach(module('cookbook'))

3、创建一个beforeEach方法用来注入必要的依赖,并且指定1中的变量来声明这些变量。包括创建一个新的scope对象和为scope指定emcee值。

beforeEach(inject(function($rootscope,$compile){
 rootscope=$rootscope;
 scope=$rootscope.$new();
 scope.emcee='Izzy Ice'
 }))

4、紧接3在beforeEach函数中加入创建指令的部分。

beforeEach(inject(function($rootscope,$compile){
 rootscope=$rootscope;
 scope=$rootscope.$new();
 scope.emcee='Izzy Ice';
 element=angular.element('<emcee></emcee>');
 $compile(element)(scope);
 }))

5、紧接着第三步在beforeEach中启动所有的watcher

 scope.$digest();

6、需要创建一个新的spec来定义期望的结果是什么。

 it('should assign scope emcee to element text when the onClick handler is called',function(){ })

7、紧接步骤6spec中,添加触发onClick的方法。

 scope.onClick

8、在步骤6spec中,添加一个用于匹配element值的期望

 expect(element.text()).tobe('Step up Izzy Ice!')

9、整合

it('should assign scope emcee to element text when the onClick handler is called', function () {
  scope.onClick ();
  expect(element.text()).toBe('Step up Izzy Ice!');
});

原理

步骤1中声明了两个能被重复测试的变量,在步骤3中使用beforeEach确保测试运行前这两个变量被分配值。在步骤3中也为scope定义了一个值scope.emcee,期望这个值能与指令相关联。在步骤4中我们编译我们的指令,
在步骤5中调用$scope.$degist确保所有的绑定都更新过了。

在步骤6中声明这个spec测试并且规定我们希望从中得到什么,我们触发scope.onClick然后利用scope提供的值来更新element。Angular element提供了一个方便的text函数,用来返回element的内容。
在步骤8中使用这个text返回的值来与 Step up Izzy Ice 进行对比。

一些常用的matchers方法。

1、实际值包含期望值。

 expect($djListItems().eq(0).html()).toContain('DStyles<br>\nQbert<br>\nMix Master Mike<br>\nShortkut<br>\nA-Trak<br>\nBabu')

2、实际值与期望值是否一致。

 expect(element.text()).toBe('iec')

3、实际值与期望值相等

 expect(scope.emcee.length).toEqual(0)

4、实际值期望值正则匹配相等

 expect(element.text().toMatch(/Eyadea/))

5、实际值是否被定义

 expect($cookies.bboy.toBeDefined)

6、如果实际值没有被定义

 expect($cookiew.bboy).not.toBeDefined()

7、实际值是否为空

 expect(BreakBeat.tracks()).tobeNull()

8、实际值是否为不空

expect(BreakBeat.tracks()).not.tobeNull();
9、实际值是否为false

 expect(element(by.css('button')).getAttribute('disabled').toBeFalsy())

10、实际值为真

 expect(angular.element(element.find('a')[0].parent().hasClass('nghide').getAttribute('disabled')).toBeTruthy())

11、实际值少于期望值

 expect(scope.deejays.length).toBeLessThan(2);

12、实际值大于期望值

 expect(scope.deejays.length).toBeGraterThan(2)

以上就是对AngularJS 单元测试 的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!

Javascript 相关文章推荐
json简单介绍
Jun 10 Javascript
javascript中的array数组使用技巧
Jan 31 Javascript
javascript 利用Image对象实现的埋点(某处的点击数)统计
Dec 28 Javascript
Egret引擎开发指南之运行项目
Sep 03 Javascript
jQuery实现textarea自动增长宽高的方法
Dec 18 Javascript
Javascript复制实例详解
Jan 28 Javascript
jQuery animate()实现背景色渐变效果的处理方法【使用jQuery.color.js插件】
Mar 15 Javascript
解决vue项目打包后提示图片文件路径错误的问题
Jul 04 Javascript
微信小程序HTTP接口请求封装的实现
Feb 21 Javascript
Layui 动态禁止select下拉的例子
Sep 03 Javascript
解决微信小程序中的滚动穿透问题
Sep 16 Javascript
浅谈vue中$bus的使用和涉及到的问题
Jul 28 Javascript
vue.js+boostrap项目实践(案例详解)
Sep 21 #Javascript
AngularJS  ng-table插件设置排序
Sep 21 #Javascript
BooStrap对导航条的改造实践小结
Sep 21 #Javascript
AngularJs $parse、$eval和$observe、$watch详解
Sep 21 #Javascript
jQuery+CSS3实现仿花瓣网固定顶部位置带悬浮效果的导航菜单
Sep 21 #Javascript
D3.js实现散点图和气泡图的方法详解
Sep 21 #Javascript
AngularJs ng-repeat 嵌套如何获取外层$index
Sep 21 #Javascript
You might like
php获取网页标题和内容函数(不包含html标签)
2014/02/03 PHP
php对数组排序代码分享
2014/02/24 PHP
php实现的操作excel类详解
2016/01/15 PHP
PHP实现数组根据某个单元字段排序操作示例
2018/08/01 PHP
Laravel数据库读写分离配置的方法
2019/10/13 PHP
基于JQuery的一个简单的鼠标跟随提示效果
2010/09/23 Javascript
jquery遍历数组与筛选数组的方法
2013/11/05 Javascript
JavaScript将字符串转换为整数的方法
2015/04/14 Javascript
分享Javascript实用方法二
2015/12/13 Javascript
MVC+jQuery.Ajax异步实现增删改查和分页
2020/12/22 Javascript
AngularJS中的指令全面解析(必看)
2016/05/20 Javascript
JavaScript仿flash遮罩动画效果
2016/06/15 Javascript
JavaScript 节流函数 Throttle 详解
2016/07/04 Javascript
Windows系统下安装Node.js的步骤图文详解
2016/11/15 Javascript
前端常见跨域解决方案(全)
2017/09/19 Javascript
详解vue+vuex+koa2开发环境搭建及示例开发
2018/01/22 Javascript
微信小程序自定义select下拉选项框组件的实现代码
2018/08/28 Javascript
JS回调函数简单易懂的入门实例分析
2019/09/29 Javascript
vue中监听路由参数的变化及方法
2019/12/06 Javascript
谈谈我在vue-cli3中用预渲染遇到的坑
2020/04/22 Javascript
Python叠加两幅栅格图像的实现方法
2019/07/05 Python
对Django中static(静态)文件详解以及{% static %}标签的使用方法
2019/07/28 Python
用python中的matplotlib绘制方程图像代码
2019/11/21 Python
在pycharm中实现删除bookmark
2020/02/14 Python
深度学习入门之Pytorch 数据增强的实现
2020/02/26 Python
搭建pypi私有仓库实现过程详解
2020/11/25 Python
python 基于pygame实现俄罗斯方块
2021/03/02 Python
使用HTML5 Canvas API中的clip()方法裁剪区域图像
2016/03/25 HTML / CSS
网站开发实习生的自我评价
2013/12/11 职场文书
培训演讲稿范文
2014/01/12 职场文书
个人现实表现材料
2014/02/04 职场文书
生产部厂长职位说明书
2014/03/03 职场文书
大学毕业典礼演讲稿
2014/09/09 职场文书
2015年敬老院工作总结
2015/05/18 职场文书
CSS 一行代码实现头像与国旗的融合
2021/10/24 HTML / CSS
Anaconda安装pytorch和paddle的方法步骤
2022/04/03 Python