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 相关文章推荐
firefox中JS读取XML文件
Dec 21 Javascript
For循环中分号隔开的3部分的执行顺序探讨
May 27 Javascript
Javascript中设置默认参数值示例
Sep 11 Javascript
js实现可旋转的立方体模型
Oct 16 Javascript
在一个页面重复使用一个js函数的方法详解
Dec 26 Javascript
Vue中的slot使用插槽分发内容的方法
Mar 01 Javascript
Angular5中状态管理的实现
Sep 03 Javascript
三种Webpack打包方式(小结)
Sep 19 Javascript
详解webpack loader和plugin编写
Oct 12 Javascript
node.js监听文件变化的实现方法
Apr 17 Javascript
ios中视频的最后一桢问题解决
May 14 Javascript
vue项目或网页上实现文字转换成语音播放功能
Jun 09 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
对于ThinkPHP框架早期版本的一个SQL注入漏洞详细分析
2014/07/04 PHP
php+ajax实现无刷新分页的方法
2014/11/04 PHP
求帮忙修改个php curl模拟post请求内容后并下载文件的解决思路
2015/09/20 PHP
Javascript实例教程(19) 使用HoTMetal(2)
2006/12/23 Javascript
jquery 插件学习(四)
2012/08/06 Javascript
JQuery中form验证出错信息的查看方法
2013/10/08 Javascript
jquery教程ajax请求json数据示例
2014/01/13 Javascript
在页面中输出当前客户端时间javascript实例代码
2016/03/02 Javascript
Node.js编写爬虫的基本思路及抓取百度图片的实例分享
2016/03/12 Javascript
微信QQ的二维码登录原理js代码解析
2016/06/23 Javascript
前端面试题及答案整理(二)
2016/08/26 Javascript
jquery判断类型是不是number类型的实例代码
2016/10/07 Javascript
JavaScript获取服务器端时间的方法
2016/11/29 Javascript
JS实现太极旋转思路分析
2016/12/09 Javascript
jquery mobile移动端幻灯片滑动切换效果
2020/04/15 Javascript
实现div滚动条默认最底部以及默认最右边的示例代码
2017/11/15 Javascript
解决vue中对象属性改变视图不更新的问题
2018/02/23 Javascript
vue实现两个区域滚动条同步滚动
2020/12/13 Vue.js
Django中实现一个高性能计数器(Counter)实例
2014/07/09 Python
python通过floor函数舍弃小数位的方法
2015/03/17 Python
用matplotlib画等高线图详解
2017/12/14 Python
详解python中asyncio模块
2018/03/03 Python
Python将文本去空格并保存到txt文件中的实例
2018/07/24 Python
Python文字截图识别OCR工具实例解析
2020/03/05 Python
Vans奥地利官方网站:美国原创极限运动潮牌
2018/09/30 全球购物
波兰在线体育用品商店:Hop-Sport.pl
2019/07/23 全球购物
美国尼曼百货官网:Neiman Marcus
2019/09/05 全球购物
EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的
2015/07/24 面试题
企业安全生产责任书
2014/04/14 职场文书
工作失职检讨书500字
2014/10/17 职场文书
老干部工作汇报材料
2014/10/28 职场文书
党的群众路线教育实践活动个人对照检查材料(医生)
2014/11/05 职场文书
2014年政工师工作总结
2014/12/18 职场文书
简历中自我评价范文
2015/03/11 职场文书
SQL Server基本使用和简单的CRUD操作
2021/04/05 SQL Server
Python中zipfile压缩包模块的使用
2021/05/14 Python