【经验】karma

1.beforeEach(inject(){...})中的代码会在beforeEach所在的describe中的每一个it(包括子describe中的it)前执行一次。
2.假如it不是写在describe中而是写在另一个it中则it中的内容不会被执行,且beforeEach不会执行。同理inject不是写在beforeEach中也不会被执行(可以写在it中执行)。
可能这里是使用了队列,在describe中执行it()时往队列里添,而写在it中的it在被执行时队列已经不接受加入了。
3.inject可以写在it中,甚至能写成it(‘‘, inject(...))
4.每个inject会重新运行一次run。也会重新生成一次$rootScope

5.关于karma的伪装响应。
使用$httpBackend.when(...).respond(200, data)来返回data。
假如要将本地html等文件作为上述data返回呢?
1. 首先需要利用$templateCache服务,本服务允许$http服务缓存经过XHR的模板请求。当一个模板被取到了,它的内容就会存储在$templateCache中,用模板路径做参数获取。
获取方式:$templateCache.get(‘xx.html‘)
2. 问题是如何将本地的xx.html放到$templateCache里呢?
我们写代码固然可以通过$templateCache.put(‘xx.html‘, ...)来往里面放内容,但本地的文件需要将模板转换成可在测试中使用的ng模块。
解决方案为使用karma-ng-html2js-preprocessor包来做转换工作。
[以上参考 《AngularJS权威教程》 19.14.7 p268]

首先需要安装包:
$ npm install --save-dev karma-ng-html2js-preprocessor
然后需要修改karma.conf.js:
files: [
  ‘**/*.html‘
],
preprocessors: {
  ‘**/*.html‘: [‘ng-html2js‘]
},
ngHtml2JsPreprocessor: {
  moduleName: ‘templates‘ // 这个是模块名字,随意取,
  cacheIdFromPath: function(filepath){
    return filepath // 这里获取到的filepath,是在上面files里定义的路径。然而这个路径与【被测试脚本】里所用的路径,可能因为根目录的不同而有差异。所以可以在这里做处理转成与测试脚本一样的路径,这样在【测试代码】里就能用这个路径获取到html了,即$templateCache(‘xxx‘),xxx与被测试脚本的路径一致。
  },
  stripPrefix: ‘‘
}
然后在test.js里先写:
beforeEach(module(‘templates‘))
beforeEach(module(‘mainApp‘))
【注意,一定要先加载templates模块,再加载你的模块。如果反过来,而你的模块中run中动态编译指令,又使用了$digest要立即渲染,这时会直接需要获取模板文件,但由于templates模块未加载无法获取文件,会报错:Error: Unexpected request: GET test/myDirective.html】
【也许是由于模板直接写到$templateCache里,所以不需要通过设置$httpBackend.when来伪装响应,更不需要$httpBackend.flush()】

然后这时伪装响应就能在收到响应时返回文件
$httpBackend.when(‘GET‘, ‘test/myDirective.html‘).respond(200, $templateCache.get(‘test/myDirective.html‘))
【注意$httpBackend.when必须在被测试文件发起请求前设置】
在it中冲刷请求:
it(‘发送请求‘, function(){
  $httpBackend.flush()
})

6. $httpBackend.flush()貌似只能使用一次。
it(‘1‘, function(){
  $httpBackend.when(...).respond(...);$httpBackend.flush();
})
it(‘2‘, function(){
  $httpBackend.when(...).respond(...);$httpBackend.flush();
})
这样会导致2里的when无法返回。改成以下则可以:
it...$http...respond(...)
it...$http...respond(...)
it...$httpBackend.flush()

7.$http的使用方法对$httpBackend.when有影响
$httpBackend.when如下:
$httpBackend.when(‘GET‘,‘/js/apps/main/tpl/questionEntry.html‘,function(){
  console.log(‘a‘)
  return true
})
.respond(200,$templateCache.get(‘/js/apps/main/tpl/questionEntry.html‘))
而使用$http({method: ‘GET‘, url:...})时,能按理console;使用$http.get(‘...‘)时,则不能console
8.假如请求的url后面有时间戳,怎么才能在$httpBackend里获取到data呢?这里似乎从某个环节开始,都不会将时间戳作为data处理,所以导致when的第三个参数无法被调用。
解决方案如下:
$httpBackend.when(‘GET‘, {
    test: function(url){
        var str = ‘/js/apps/main/tpl/questionEntry.html‘
            return url.indexOf(str) != -1
    }
})
.respond(200,$templateCache.get(‘/js/apps/main/tpl/questionEntry.html‘))
请求使用directive、$http都可以发送。

9.在做inject注入时,如果多次注入,要注意每次所获取到的服务都是全新的。所以当第二个inject里的服务与第一个inject里的服务混用时会产生问题。

时间: 2024-10-10 22:39:46

【经验】karma的相关文章

微信小程序豆瓣电影项目的改造过程经验分享

在学习微信小程序开发过程中,一部分的难点是前端逻辑的处理,也就是对前端JS的代码编辑:一部分的难点是前端界面的设计展示:本篇随笔基于一个豆瓣电影接口的小程序开源项目进行重新调整,把其中遇到的相关难点和改进的地方进行讨论介绍,希望给大家提供一个参考的思路,本篇随笔是基于前人小程序的项目基础上进行的改进,因此在开篇之前首先对原作者的辛劳致敬及感谢. 1.豆瓣电影接口的小程序项目情况 豆瓣电影接口提供了很多相关的接口给我们使用,豆瓣电影接口的API地址如下所示:https://developers.d

【Spark深入学习 -14】Spark应用经验与程序调优

----本节内容------- 1.遗留问题解答 2.Spark调优初体验 2.1 利用WebUI分析程序瓶颈 2.2 设置合适的资源 2.3 调整任务的并发度 2.4 修改存储格式 3.Spark调优经验 3.1 Spark原理及调优工具 3.2 运行环境优化 3.2.1 防止不必要的分发 3.2.2 提高数据本地性 3.2.3 存储格式选择 3.2.4 选择高配机器 3.3 优化操作符 3.3.1 过滤操作导致多小任务 3.3.2 降低单条记录开销 3.3.3 处理数据倾斜或者任务倾斜 3.

《运营笔记》:主要是猫扑论坛运营经验。3星。

书中有不少运营的经验,其中以作者在猫扑的运营经验为主.条理略差,在移动互联网时代这些经验的价值也在逐步降低中.总体来说还是值得看一看的.我的评价是3星. 以下是书中一些内容的摘抄: 1:其实真正有消费能力的用户,白天可能根本不会上你的平台,因为他们都有自己繁忙的事情要处理.他们很可能晚上出现.如果你第一次不理他,第一次不理他,第三次还是不理他,那么,很有可能意味着你将失去他了.p56 2:如果帖子内容里面含有视频.图片,可以在标题里加上(图).(视频).(图+视频)的字样.p59 3:最好的用户

ZooKeeper和Curator相关经验总结

一.关于ZooKeeper的watch用法,需要注意 详细说明如下: ZooKeeper Watches All of the read operations in ZooKeeper - getData(), getChildren(), and exists() - have the option of setting a watch as a side effect. Here is ZooKeeper's definition of a watch: a watch event is o

基于MVC+EasyUI的Web开发框架经验总结(1)-利用jQuery Tags Input 插件显示选择记录

最近花了不少时间在重构和进一步提炼我的Web开发框架上,力求在用户体验和界面设计方面,和Winform开发框架保持一致,而在Web上,我主要采用EasyUI的前端界面处理技术,走MVC的技术路线,在重构完善过程中,很多细节花费不少时间进行研究和提炼,一步步走过来,也积累了不少经验,本系列将主要介绍我在进一步完善我的Web框架基础上积累的经验进行分享,本随笔主要介绍利用jQuery Tags Input 插件显示选择记录. 我在利用jQuery Tags Input 插件之前,一直想找一个合适的J

基于MVC+EasyUI的Web开发框架经验总结(2)- 使用EasyUI的树控件构建Web界面

最近花了不少时间在重构和进一步提炼我的Web开发框架上,力求在用户体验和界面设计方面,和Winform开发框架保持一致,而在Web上,我主要采用EasyUI的前端界面处理技术,走MVC的技术路线,在重构完善过程中,很多细节花费不少时间进行研究和提炼,一步步走过来,也积累了不少经验,本系列将主要介绍我在进一步完善我的Web框架基础上积累的经验进行分享,本随笔主要介绍使用EasyUI的树控件构建Web界面的相关经验. 在很多界面设计上,我们可能都需要引入树列表控件,这个控件可以用zTree来实现,也

android菜鸟必看的60个技术经验

最初,android工程师在开发app时,会遇见各种各样的问题,比如数据加载.信息同步等等,其主要原因才开始,会android项目开发(http://www.maiziedu.com/course/android/)不熟悉,还有就是不知道如何处理才妥当,下面小编就整理了网上各位android工程师的一些技术经验分享给大家:  1. 全部Activity可继承自BaseActivity,便于统一风格与处理公共事件,构建对话框统一构建器的建立,万一需要整体变动,一处修改到处有效.  2. 数据库表段

一个大水的微信入坑经验

最近搞微信整的我好无语,原因是自己太水了.总结了几点经验如下: 部署客户的微信时,最好把自己的测试的账号先取消关注了在部署.这样有助于及早的发现出现的问题. 菜单中的有网页授权时,首先那个appid一定要写成客户的,不要写自己的,切记!(我犯了好几次这样的错误,无语...)微信公众平台的网页授权的验证要配置域名,这个一般没啥问题. 一般在配置文件中,会有配置appid的key,如果没有,就去微信处理的核心类找,一般都会在配置文件中放着.记得改成客户的.(这个错误我也犯了多次,无语...) 如果发

10+年程序员总结的20+条经验教训

开发 1.从小事做起,然后再扩展 无论是创建一个新的系统,还是添加功能到现有的系统中,我总是从一个简单到几乎没有任何所需功能的版本启动,然后再一步一步地解决问题,直到满意为止.我从来没有妄想过能够一步登天.相反,我一边开发一边学习,同时新掌握的信息还可以用于解决方案中. 我很喜欢John Gall的这句话:"复杂系统总是源于简单系统的演化." 2.一次只改变一件事 当我们在开发时,碰到测试失败和功能无效的情况,如果你一次只研究一个问题,那将会更容易找到问题的关键.换言之,就是使用短迭代