WilliamRowden基于静态依赖的测试

作者:小菜 更新时间:2025-03-14 点击数:
简介:概要 在William的演讲中,将使用JUnit和其他一些工具,如一个使用eclipse重构菜单的可测试系统、使用EasyMock进行注射伪对象依赖(在 con

【菜科解读】

概要 在William的演讲中,将使用JUnit和其他一些工具,如一个使用eclipse重构菜单的可测试系统、使用EasyMock进行注射伪对象依赖(在 constructor或者setter中),基于PowerMock的旁路封装,使用AspectJ分离concerns等。

还将讨论如何在已有代码的限制条件下,选择合适的方案解决单元测试的需求,并展示如何应用测试驱动新代码。

演讲中还会提供一些示例代码。

个人简介 William Rowden,经过认证的ScrumMaster、敏捷教练,在SolutionsIQ担任培训师,他在企业级敏捷实施方面有多年的经验。

他曾在美国、墨西哥和中国帮助客户学习敏捷软件开发过程中的技术和工程实践。

他已经和近百名管理人员、测试人员和开发者协作,帮助他们完成从传统开发方法到实施敏捷的转变。

除了教授技术实践,William还参与CSM和CSPO等课程培训。

关于会议 “敏捷技术日”由敏捷领域最具有影响力的技术社区InfoQ中文站发起和组织,旨在进一步在国内技术社区推广敏捷概念和实践,将敏捷实施领域备受关注以及比较前沿的领域整合在一起,以培训和分享的形式深入探讨中国企业如何更好地实施敏捷,以及正确地使用敏捷。

“敏捷技术日” 是开放的社区活动,同时邀请国内外有着相同使命的企业和个人共同参与。

WilliamRowden,基于,静态,依赖,的,测试,概要

基于jquery级联的下拉插件

var dataToOption = function(data, op) { var d = [], vs = [], hasFilter = op.filter && $.isFunction(op.filter); $.each(data, function(i, v) { if(!hasFilter || (hasFilter && op.filter(v, i))) { if($.inArray(v[op.dataMap.value], vs) == -1) { d.push($.extend({}, v)); vs.push(v[op.dataMap.value]); if(op.order) { var sp = op.order.split(‘ ‘), col = sp[0], sort = sp[1].toLowerCase() == ‘asc‘ ? 1 : -1; d.sort(function(a, b) { if(a[col] > b[col]) { return sort; } else if(a[col] ‘ + v[‘text‘] + ‘‘; return _ops; var createGroup = function(group, options) { return ‘‘ + options; if(op.preValue || op.preText) { ops += createOption({‘value‘: op.preValue, ‘text‘: op.preText}); if(gps[missGroup] != undefined) { ops += createOption(gps[missGroup]); delete gps[missGroup]; if(op.groupSort == ‘desc‘) { gps[‘keys‘].sort().reverse(); } else if(op.groupSort == ‘asc‘) { gps[‘keys‘].sort() $.each(gps[‘keys‘], function(i, v) { ops += createGroup(v, createOption(gps[v])); return ops; var mapData = function(data, map) { $.each(data, function(i, v) { $.each(map, function(j, k) { if(v[j] == undefined) { data[i][j] = v[k] == undefined ? ‘‘ : v[k]; delete data[i][k]; return data; var groupData = function(data) { var gps = {}; gps[‘keys‘] = []; var pushData = function(group, item) { if(gps[group] == undefined) { gps[group] = []; gps[group].push(item); var pushKey = function(key) { if($.inArray(key, gps[‘keys‘]) == -1) { gps[‘keys‘].push(key); $.each(data, function(i, v) { if(v[‘group‘]) { pushKey(v[‘group‘]); pushData(v[‘group‘], v); } else { pushData(missGroup, v); return gps; $.fn.fillselect = function(urlOrData, options) { return this.each(function() { var $t = $(this), op, dataReadyCallback, ajaxXHR = null; op = $.extend(true, {}, defaultOptions, options); $t.data(‘fillselectOptions‘, op); if(op.before && $.isFunction(op.before)) { op.before.apply($t); dataReadyCallback = function(data) { $t.html(dataToOption(data, op)); if(op.defaultValue) { $t.val(op.defaultValue); if(op.after && $.isFunction(op.after)) { op.after.apply($t); $t.trigger(‘change‘); if(typeof urlOrData == ‘string‘) { if(ajaxXHR) { ajaxXHR.abort(); ajaxXHR = $.ajax({ ‘url‘: urlOrData, ‘type‘: op.usePost ? ‘post‘ : ‘get‘, ‘data‘: op.params, ‘dataType‘: ‘json‘, ‘success‘: function(data) { ajaxXHR = null; if(data.status == ‘200‘) { dataReadyCallback(data.data || []); ‘error‘: function() { ajaxXHR = null; } else { dataReadyCallback(urlOrData); $.fn.chainselect = function(target, urlOrData, options) { return this.each(function() { $(this).bind(‘change‘, function() { var $t = $(this), op; op = $.extend(true, {}, defaultOptions , options); op.params[$t.attr(‘name‘) || $t.attr(‘id‘)] = $t.val(); op.params[‘id‘] = $t.val(); if($t.val() != $t.data(‘fillselectOptions‘).preValue) { $(target).fillselect(urlOrData, op); } else { op.after = null; $(target).fillselect([], op);})(jQuery);此段代码实际上包含了两个jq插件,第一个是fillselect用于填充select,支持data或url(ajax)的方式;第二个是chainselect用于级联select。

下面就详细介绍一下这段代码:var defaultOptions = { after: null, before: null, usePost: false, defaultValue: null, filter: null, preValue: ‘-1‘, preText: ‘請選擇‘, groupSort: ‘desc‘, order: ‘name asc‘, params: {}, dataMap: {‘text‘: ‘text‘, ‘value‘: ‘value‘, ‘group‘: ‘group‘} };插件的默认参数配置after:select数据载入结束事件callbackbefore:数据载入前事件callbackusePost:ajax请求方式,默认为GETdefaultValue:默认选中的值filter:数据过滤函数,类似jq的grep方法,使用方式也是一样的,第一个参数为value,第二个参数为key或index,当返回值为false即过滤掉该条数据,如:filter: function(v, i) { return v.count > 1; }过滤数据中count属性小于1的数据preValue,preText:初始option的值和文字groupSort:分组optgroup排序方式order:数据的排序方式,排序字段与方向空格隔开params:随ajax请求传递的参数dataMap:数据属性映射,目的提高插件对数据的自适应性,如真实数据是name,id,year,则dataMap: { ‘text‘: ‘name‘, ‘value‘: ‘id‘, ‘group‘: ‘year‘ };如果不使用分组功能,只需保留text和valuemissGroup:缺省分组名;dataToOption:用于将数据转换成option;mapData:将数据转成统一格式;groupData:将数据分组;这段实现逻辑略显冗长,因为实际项目中的需求多变,这个可根据实际需求简化一下代码。

$.fn.fillselect在dataReadyCallback中触发change事件主要目的是使此select的下一级生效;$.fn.chainselect多了一个target参数用于指向下一级的jq选择器。

那么现在来看下怎么使用,需求:厂牌brand->车款kind->车型model,ajax获取的数据格式为{status: 200, data: [{id: 1, name: ‘bmw‘}, {id: 2, name: ‘benz‘}]};车型的数据需要根据year_name分组 $(‘#brand‘).chainselect(‘#kind‘, ‘/request_url‘, { ‘dataMap‘: {‘value‘: ‘id‘, ‘text‘: ‘name‘}, ‘preValue‘: -1, ‘preText‘: ‘選擇/車款‘, ‘params‘: {‘type‘: ‘_cache_kind‘}, ‘before‘: function() { this.attr(‘disabled‘, true); ‘after‘: function() { this.removeAttr(‘disabled‘); ‘defaultValue‘: lastKindId || -1 $(‘#kind‘).chainselect(‘#model‘, ‘/request_url‘, { ‘dataMap‘: {‘value‘: ‘myid‘, ‘text‘: ‘name‘, ‘group‘: ‘year_name‘}, ‘preValue‘: -1, ‘preText‘: ‘選擇/車型‘, ‘params‘: {‘type‘: ‘_cache_model‘}, ‘filter‘: function(v, i) { return $.inArray(v.myid, myids) === -1; ‘before‘: function() { this.attr(‘disabled‘, true); ‘after‘: function() { this.removeAttr(‘disabled‘); $(‘#brand‘).fillselect(‘/request_url‘, { ‘dataMap‘: {‘value‘: ‘id‘, ‘text‘: ‘name‘}, ‘preValue‘: -1, ‘preText‘: ‘選擇/廠牌‘, ‘params‘: {‘type‘: ‘_cache_brand‘}, ‘defaultValue‘: lastBrandId || -1 }); 基于,jquery,级联,的,下拉,插件,基于,jquery

最强大,功能丰富的基于Web的代码编辑器(集成开发环境)

前往文本编辑器专题 在目前所有谈论云计算和阅读后,博客的几个月前,质疑是否有人为基于Web的集成开发环境的权利时Dzones短的文章?,足以鼓舞我们走出去,并找出网站(集成开发环境)的集成开发环境,可及,实际上是最好的。

结果有点令人感到意外。

我们发现,在不同的字面了数百基于网络的编辑,工具和各种可能的语言,你能想到的发电机。

问题是很少见了作为IDE的强大,功能丰富我们的朋友的标准。

这些工具很多要么已多年没有更新,还是他们包足够的功能是有益的或功能的宏伟规模当作。

其他工具,看上去他们可能有潜力,但发展缓慢,令人失望。

正如您可能已经猜到有在浏览器的许多尝试的IDE在过去数年的,所以我们对这篇文章汇编是一个集成开发环境的不仅是功能性,打磨及专业的选择,但也准备采取下一个步骤,是最好的基于Web的代码编辑解决方案。

这里是我们的基于网络的集成开发环境最喜爱的选择:CodeRun - 一个免费的,跨平台的基于浏览器的IDE是一个自由和开放源码基于Web的IDE,它采用了原生支持C#/。

净额(3.5),PHP的(5.1),JavaScript,HTML和CSS的。

C#中支持包括ASP.NET中,WCF中,浏览器的Silverlight和WPF应用程序开发和部署。

数据库支持包括sql server 2005和亚马逊SimpleDB的。

语法着色和代码完成的功能,帮助您在开发过程中。

它还具有一个在线调试器,允许您设置断点,通过您的代码的步骤,检查调用栈,调试和其他行动。

你可以或者使用作为您的桌面IDE中,完全取代了功能丰富和强大的CodeRun或者你可以用它来上传现有的代码和测试在云端,或与您的同行分享。

贝斯平 从Mozilla的实验室,贝斯平的目标是成为‘顶级的在线文本编辑器,在浏览器中的生命。

它是基于最新的Web标准,确实需要一个 现代浏览器支持HTML5的,特别是有能力绘制文本Canvas元素 。

根据您所要完成多少时间你愿意来投资,有几种方法,可以在其中使用贝斯平:你可以尝试直接在IDE(贝斯平演示),下载贝斯平为自己使用嵌入式应用程序或您可以设置自己的贝斯平服务器(微弱的心脏没有!)。

目前很流行的,功能丰富,非常强大的艾米编辑器支持语法突出显示多国语言,在不同的标签打开多个文件,并具有集成的调试工具,甚至允许您管理从这个基于Web的编辑多个项目的所有。

ecoder ecoder是一个简单的,网上的代码编辑器,其中包括一个文件浏览器,文件上传,和标签制度,允许多个文件要在同一时间进行编辑。

使用此Web应用程序开发人员可以直接在线编辑代码,实时语法突出显示的文字区域和键盘捷径处理借给了一个本地安装的应用程序感觉。

Codeita Codeita是一个功能强大,易于使用,基于云,网站开发环境。

这是一个强大的代码编辑器,一个先进的SVG图像编辑器和一个有用的项目管理和协作工具。

它允许用户代码,开发,集思广益,沟通,然后公布的项目和文件到web服务器。

没有更多的麻烦与备份和同步你的笔记本电脑与您的桌面。

或您与您的笔记本个人电脑业务。

突出显示的代码完成,本地/生活编辑,项目共享,图像编辑等。

ShiftEdit ShiftEdit目前正在发展,而且是功能。

它拥有的东西你会期望从一个IDE包括内置的FTP,被选中的接口,并支持编辑HTML,js中,CSS或PHP的大多数文件。

工作区 工作区是一个完整的在线开发环境,让你您的网站为基础的项目的全面管理。

有了内建的语法高亮编辑器,可以编辑文本,PHP和JavaScript的,HTML格式,爪哇,Perl,SQL和其他类型的文件在远程服务器直接。

查找和管理这些文件最便捷的尖端档案管理权的嵌入式应用程序工具。

有了这个工具,用户可以连接到和管理上的任意数量的FTP站点的文件同步。

markItUp! markItUp!是一个JavaScript插件的jQuery库建成。

它可以让你变成一个标记编辑任何文字区域。

HTML中,纺织,Wiki语法,降价,BB码或什至你自己的标记系统可方便地实现。

markItUp!是不是基于IDE的一个网站,也不是意味着是一个 全功能,出位的现成 主编。

相反,它是一个非常轻量级的,可定制和灵活的引擎,以应付他们的CMSes,博客,论坛或网站开发人员的需求。

jsFiddle - 在线网页编辑器 jsFiddle是一个编辑器,允许您保存并运行Web浏览器内的所有应用程序。

它目前支持的JavaScript,MooTools的,jQuery的,原型,锐,辉光和道场,HTML和CSS。

Ideone.com Ideone是一个在线的编译器和调试工具,它可以让你来编译,运行,测试和在40多个编程语言的网上共享代码。

它还提供了与它获得自由Ideone API,它是作为一个Web服务可用,的功能让您建立自己的ideone式服务。

CSSDesk CSSDesk是没有在附近,以作为一个全功能的IDE,也不尽量。

它是什么,是一个很酷,简单,非常容易对任何使用CSS和HTML实验试验平台。

你有没有找到自己需要或想尝试在CSS和HTML的东西出来,但不希望打开一个文本编辑器和所有一起扔件开始了吗?这就是CSSDesk用武之地只需编辑占位符的代码,你会看到更新的活的结果。

PHPanywhere PHPanywhere是一个完整的基于Web的免费PHP语言的IDE,换句话说,它是一个应用程序,让开发的所有代码编辑功能,他们需要开发PHP在线申请。

它包括一个为所有网络格式的编辑器和一个强大的FTP支持实时语法代码编辑器。

Rendera - HTML5的编辑器 不知你是否对CSS3和HTML5的新特性和功能,所有的挣扎? Rendera可以提供帮助。

输入您的HTML代码,看看它在实时渲染,然后利用CSS样式使用的HTML 5或您的浏览器对CSS3标签支持任何。

您可能想了解腹肌和上海社会科学院,它也支持那些。

您也可以尝试一些使用Javascript交互以及。

他们已经加载的jQuery和jQuery和jQuery UI的工具,因此您可以与这些图书馆的实验了。

Drawter.com - 可绘制标记语言 Drawter是一个基于Web的编辑器(写在JavaScript和jQuery库为基础),有不少字面上可以请你网站的代码与每个标记,作为一个你画层提出。

目前Drawter是在Pro版本(它仍然是免费的),这意味着对HTML和CSS知识是必不可少的。

该Drawters发展的未来目标是建立一个业余的版本,这将允许您绘制没有任何HTML或CSS的知识是什么,这样的一次您的网站。

留意其今年推出一段时间。

生活样式表编辑! 如果上述所有的网站编辑,插件和工具为你太多,只打又如何与这个小工具有关。

编辑样式,很少看到你的结果现场,其比有用的更加有趣,但肯定可以减轻发展压力! 最,强大,功能,丰富,的,基于,Web,代码,编辑器,

加入收藏
               

WilliamRowden基于静态依赖的测试

点击下载文档

格式为doc格式

  • 账号登录
社交账号登录