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 相关文章推荐
非常不错的功能强大代码简单的管理菜单美化版
Jul 09 Javascript
Web跨浏览器进程通信(Web跨域)
Apr 17 Javascript
jQuery 调用WebService 实例讲解
Jun 28 Javascript
AngularJS表单详解及示例代码
Aug 17 Javascript
利用JavaScript判断浏览器类型及版本
Aug 23 Javascript
微信小程序开发之麦克风动画 帧动画 放大 淡出
Apr 18 Javascript
jQuery幻灯片插件owlcarousel参数说明中文文档
Feb 27 jQuery
微信小程序实现自上而下字幕滚动
Jul 14 Javascript
详解Angular6 热加载配置方案
Aug 18 Javascript
vue 父组件通过$refs获取子组件的值和方法详解
Nov 07 Javascript
vue实现单一筛选、删除筛选条件
Oct 26 Javascript
JavaScript 原型与原型链详情
Nov 02 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 获得汉字拼音首字母的函数
2009/08/01 PHP
PHP关联链接常用代码
2012/11/05 PHP
PHP内存缓存Memcached类实例
2014/12/08 PHP
php判断访问IP的方法
2015/06/19 PHP
PHP抓取淘宝商品的用户晒单评论+图片+搜索商品列表实例
2016/04/14 PHP
PDO的安全处理与事物处理方法
2016/10/31 PHP
laravel 使用auth编写登录的方法
2019/09/30 PHP
php文件上传原理与实现方法详解
2019/12/20 PHP
Jquery 学习笔记(一)
2009/10/13 Javascript
Javascript中获取出错代码所在文件及行数的代码
2010/09/23 Javascript
jQuery调用WebService的实现代码
2011/06/19 Javascript
利用了jquery的ajax实现二级联互动菜单
2013/12/02 Javascript
js怎么判断flash swf文件是否加载完毕
2014/08/14 Javascript
详解JavaScript时间格式化
2015/12/23 Javascript
Node.js查找当前目录下文件夹实例代码
2017/03/07 Javascript
JS实现图片放大镜插件详解
2017/11/06 Javascript
vue 遮罩层阻止默认滚动事件操作
2020/07/28 Javascript
Vue 3自定义指令开发的相关总结
2021/01/29 Vue.js
Python getopt模块处理命令行选项实例
2014/05/13 Python
Python中Random和Math模块学习笔记
2015/05/18 Python
Python删除windows垃圾文件的方法
2015/07/14 Python
Python实现更改图片尺寸大小的方法(基于Pillow包)
2016/09/19 Python
python实现下载文件的三种方法
2017/02/09 Python
Python将多份excel表格整理成一份表格
2018/01/03 Python
Python计算一个给定时间点前一个月和后一个月第一天的方法
2018/05/29 Python
Django 多环境配置详解
2019/05/14 Python
Python获取一个用户名的组ID过程解析
2019/09/03 Python
浅析Django 接收所有文件,前端展示文件(包括视频,文件,图片)ajax请求
2020/03/09 Python
python rolling regression. 使用 Python 实现滚动回归操作
2020/06/08 Python
Python图像阈值化处理及算法比对实例解析
2020/06/19 Python
详解解决jupyter不能使用pytorch的问题
2021/02/18 Python
浅谈css3中的前缀
2016/07/20 HTML / CSS
《梅兰芳学艺》教学反思
2014/02/24 职场文书
民族团结先进个人事迹材料
2014/06/02 职场文书
初中教师个人总结
2015/02/10 职场文书
CSS中使用grid布局实现一套模板多种布局
2022/07/15 HTML / CSS