首页>参考读物>计算机科学与技术>软件与程序设计

测试驱动的JavaScript开发
作者 : (美)Christian Johansen 著
译者 : 赵勇 程德 凌杰 高博 译
出版日期 : 2012-02-09
ISBN : 978-7-111-36274-6
定价 : 69.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 392
开本 : 16
原书名 : Test-Driven JavaScript Development
原出版社: Pearson Education Asia
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

本书是一本完整的、基于最佳实践的JavaScript敏捷测试指南,同时又有着测试驱动开发方法(TDD)所带来的质量保证。领先一步的JavaScript敏捷开发者Christian Johansen的讨论涵盖了将最先进的自动化测试用于JavaScript开发环境的方方面面,带领读者走查整个开发的生命周期,从项目启动到应用程序部署。本书的主要内容包括:掌握自动化测试和TDD;构建有效的自动化测试工作流;测试浏览器和服务器两端的代码(使用Node.js)、运用TDD构建更加干净的API、更加模块化的代码以及更健壮的软件;编写可测试的代码;使用测试桩和模拟对象,将各个单元单独进行测试;通过重构持续进改代码;走查全功能软件的创建和自动化测试。

图书前言

作者对于本书的观点
  近年来,JavaScript已经发展壮大。“DHTML”的峥嵘岁月已经一去不复返,我们现在身处的是“Ajax”、甚至是“HTML5”的时代。在过去的几年里,JavaScript产生了一些杀手级应用;它也研发出了一些健壮的库,以帮助开发者书写跨浏览器脚本;它还有了一组工具,例如调试器、分析器,以及单元测试框架。整个社区不知疲倦地工作,将他们所知晓和喜欢的用于其他语言的工具带入JavaScript,以为它准备一个“真实”的开发环境,在此环境中人们可以借鉴从其他环境中获取的工作流和知识经验,集中精力构建高质量的应用程序。
  不过,JavaScript社区总体来说还不够侧重于自动化测试,测试驱动开发在JavaScript开发工程师中还比较罕见—即使他们已经工作在这么一种可能目标平台最为宽泛的语言之上。在很长的一段时间里,这种现象可能是缺乏工具支持的结果,但是新的单元测试框架可谓层出不穷,它们为测试代码提供了无穷无尽的方法,并且让您感觉顺手。即使如此,大多数的Web应用程序的开发人员仍然在测试其JavaScript代码方面缩手缩脚。我难得遇到一位Web开发人员能够具有某种程度的信心将他的应用程序的核心功能提取出来并加以重新安排,而这正是强力的测试套件赋予开发人员的能力。这种信息会减少开发人员对应用程序出错的担心,从而能够更加放心地集中精力于实现新的功能。
  本书将展示,JavaScript中的单元测试和测试驱动开发已经有了长足的进步。它将帮助您写出更漂亮的代码,并成为更具生产力的开发工程师。
本书内容
  本书主要讲述实践中的JavaScript开发,采用了测试驱动开发所提倡的技术和工作流。它也讲述了如何通过测试覆盖率数据来增加您对代码的信心,并获得无所顾忌的重构和系统地开发代码库的能力。它还讲述了如何编写模块化的、可测试的代码,以及如何编写在各式各样的环境中运作,并且不会给您的用户带来麻烦的JavaScript。
本书的内容组织
  本书分为4个部分。您可以用自己习惯的任何顺序来阅读。第二部分介绍了一些在全书范围内使用的工具,但是它们的用法您应该已经足够清楚,所以,如果您已经对JavaScript开发中诸如“不唐突的JavaScript”以及“特性检测”这样的主题有着坚实的理解的话,那么您就完全可以先将这部分略过。
  第一部分:测试驱动开发
  第一部分将介绍自动化测试和测试驱动开发中的概念。我们将从审视单元测试是什么、它做了什么、有什么好处来入手。然后,我们将围绕它们建立起自己的工作流,与此同时介绍测试驱动的开发流程。我将给您演示若干可用的JavaScript单元测试框架,讨论它们的优点和缺点,最后更加仔细地研究那个我们将在全书范围内使用的框架。
  第二部分:开发人员的JavaScript
  第二部分将更深入地研究JavaScript程序设计。这部分并非完整地介绍JavaScript语言。您应该已经有一些JavaScript的经验(可能是用过诸如jQuery、Prototype这样的库)或者有一些其他编程语言的经验。如果您是一名之前没有JavaScript经验的程序员,本部分有助于您理解JavaScript在哪些方面与其他语言不同,尤其是与其他在动态性方面略逊一筹的语言有何不同,并且给您打好必需的基础,以使您能看懂在第三部分那些实践中的例子。
  如果您早已对闭包、原型继承及其动态本质,以及特性检测等高级JavaScript概念了如指掌,那么您可能仅仅想翻翻本部分的内容作为提醒,或者直接跳至第三部分。
  在讲述JavaScript的细节时,我将采用单元测试的手段来说明这门语言,并借此机会让测试来驱动我们实现一些辅助函数,以备我们在第三部分中使用。
  第三部分:JavaScript测试驱动开发实践
  这一部分将完成一系列处于不同环境中的小型项目。我们将学会如何开发一套小型的通用JavaScript API,如何开发一个依赖于DOM的小工具(Widget),如何将浏览器的差异抽象化,如何实现一个服务器端的JavaScript应用程序等—统统采用测试驱动开发。这部分着重讲述测试驱动开发可以怎样有助于构建更干净的API、更模块化的代码,以及更健壮的软件。
  每一个项目都通过实现一段完整的功能、但有限的代码引入了一些新的与测试相关的概念,并说明它们在实践中的运用。在该部分中,除了其他事项外,我们还将学习如何测试依赖于浏览器API、定时器、事件处理器、DOM操作和异步服务器请求(即“Ajax”)的代码。我们也将考察实践中采用的技术,如存根、重构,以及运用设计模式来优雅地解决问题。
  这一部分的各章将会提供如何扩展已开发功能的思路,并赋予您实践的能力,以自己动手完成代码的改进。扩充版本的解决方案都可以从本书的网站上下载。
  我在这些项目中花费了大量的心血以保证编写出可运行的代码,并完成相应的工作。这个部分的5章所得出的最终结果是一套功能齐全的即时通信客户端和服务器,未使用测试驱动开发之外的任何技术,未使用JavaScript之外的任何语言。
  第四部分:测试模式
  本书最后一部分以更宽泛的视角回顾了在整个第三部分所采用的一些技术。对测试替身,如模和桩,将进行更细致的考察,伴随着讲述多种形式的测试验证技术。最后,我们将回过头来重新审视一些指导原则,从而帮助您编写良好的单元测试。
本书所采用的约定
  JavaScript是Brendan Eich在1995年为网景公司(Netscape)设计的语言名称。自那时以来,已经涌现出了多种替代性的实现,并且该语言已经由ECMA国际标准化为ECMA-262,又称ECMAScript。尽管这些替代性的实现也各有名字,比如微软的JScript,但它们一般都统称为“JavaScript”,而我也正是在这样的意义上使用JavaScript这个名字的。
  全书范围内,我们使用等宽字体来表示对象、函数以及小型代码段。
本书读者对象
  本书面向的是程序设计人员,尤其是那些编写或有兴趣编写JavaScript代码的软件开发人员。无论您是一位Ruby开发人员,主要关注Ruby on Rails;或者是一名Java或.NET开发人员,忙于构建Web应用;又或者是一名前端Web开发人员,以JavaScript、CSS和HTML为首要工具;甚至是一名后端开发人员,对JavaScript知之甚少,我都希望本书将对您有用。
  本书旨在供那些需要更坚实地掌握或更精细地了解JavaScript语言的Web应用程序开发人员使用,也可供他们更好地理解如何提高他们的生产力和信心,并编写出更具可维护性的、带有更少缺陷的应用程序。
阅读本书所要求的技能
  本书不要求读者以前有任何单元测试或测试驱动开发的知识。在整本书中都有自动化测试演示,通过阅读本书可以让您很好地掌握如何成功地运用它们。
  同样,读者并不需要是JavaScript专家,或中等用户。我希望本书对于那些只懂JavaScript皮毛的开发者,以及JavaScript高手能够同等地有用。然而,您必须多少懂一些程序设计,这就是说,为了充分地享受本书,您应该有某种语言的程序设计经验,并且熟悉Web应用程序的开发。本书并不是讲述任何程序设计基础的入门材料,连Web应用程序相关主题的程序设计基础也没有提及。
  本书的第二部分重点在JavaScript语言,但仅仅着眼于使JavaScript卓尔不群的那些特质,这些内容并不适于当做是对该语言的完整介绍。我们期望您能够通过例子中的用法,掌握这个部分中未专门讲述的语法和概念。
  特别要指出的是,第二部分侧重于JavaScript函数和闭包、JavaScript对象模型,包括原型继承,以及支持代码复用的模式。此外,我们还将讨论相关的程序设计实践,比如不唐突的JavaScript,以及特性检测,这两个主题是Web开发人员都要掌握的。
关于本书的网站
  本书附有一个网站,http://tddjs.com。访问这个地址,您可以找到书中所有的代码清单,既提供ZIP压缩文件下载,也提供完整的Git资源库,后者可以让您浏览代码的修订历史,以了解代码是如何演变的。Git资源库对于第三部分的样例项目尤其有用,因为那里涉及大量的重构。通过浏览Git资源库的修订历史,可以让您看到每一步的变化,甚至包括他们何时会改动现有代码。
  您还可以通过http://cjohansen.no访问我的个人网站,您会在那里发现更多的讨论文章和联系信息等。如果对本书有任何意见,我十分乐意听取你们的反馈。

上架指导

计算机\程序设计

封底文字

“这是一本将应用程序生命周期中最易轻视的部分深入浅出地解释到位的书。Christian Johansen采用了现实世界中的例子,由浅入深,提供了一个有用的代码库。我简直无法为本书找到更多赞美之词了。它带给我们如此之多的教益,又是那么的琅琅上口。”
——Andrea Giammarchi,开发部主管,诺基亚 Gate 5 GmbH

“一本伟大的书,它的伟大之处在于将理论与实际例子相结合,它既适合于JavaScript/TDD新手,也适合于那些久经沙场却还想向他们的技能库中添砖加瓦的JavaScript高手。”
——Jacob Seidelin,自由Web开发人员,Nihilogic

对于那些工作在日益庞大和复杂的项目中的JavaScript开发人员来说,有效地实施自动化测试是成功的关键。本书是一本完整的、基于最佳实践的JavaScript敏捷测试指南,同时又有着测试驱动开发方法所带来的质量保证。领先一步的JavaScript敏捷开发者Christian Johansen的讨论涵盖了将最先进的自动化测试用于JavaScript开发环境的方方面面,带领读者走查整个开发的生命周期,从项目启动到应用程序部署,还有更多的精彩内容。
本书内容:
 掌握自动化测试和TDD
 构建有效的自动化测试工作流
 测试浏览器和服务器两端的代码(使用Node.js)
 运用TDD构建更加干净的API、更加模块化的代码以及更健壮的软件
 编写可测试的代码
 使用测试桩和模拟对象,将各个单元单独进行测试
 通过重构持续改进代码
 走查全功能软件的创建和自动化测试

作者简介

(美)Christian Johansen 著:Christian Johansen就职于Shortcut AS公司,这是一家专注于开源技术、Web和移动应用程序的软件公司。他的专业是信息学、数学和数字信号处理。在他的职业生涯中,他主要从事Web和前端开发,熟悉、CSS和HTML技术。他是一名活跃的开源贡献者,他的博客涉及与、Ruby和Web开发相关的内容,博客地址是cjohansen.no。

译者简介

赵勇 程德 凌杰 高博 译:暂无简介

译者序

近年来,移动互联网的Web开发技术渐成显学。随着智能手机和平板电脑等移动终端的规模化普及,以及无线宽带网络覆盖率的大幅提高,对于移动互联网上Web应用的需求也必然变得愈加迫切。在这样的大背景下,Web标准化组织也在全力推进新的Web标准—HTML5。但是与此同时,随着设备和浏览器的多样化,以及新的Web标准的推行,对于Web开发人员,特别是以JavaScript为主要开发语言的开发者来说,一方面带来了新的市场机遇,另一方面也带来了前所未有的挑战。在这些挑战中,自然而然地包括下面这样的问题:
  ?如何面对未知的设备和浏览器来编写行为符合预期的JavaScript代码?
  ?如何重构已有的JavaScript代码,以适应新的运行环境?
  ?有哪些JavaScript特性是可以依靠的,即使Web标准可能发生一些变化?
  ?怎样在Web产品发布之前,就能够模拟大量用户使用的场景,找出可能存在的问题?
  ?有哪些新的JavaScript技术能够大大地改进前端和后端的通信效率?
  从解答以上这些、甚至更多问题的视角来看,本书的出版可谓适逢其时。Christian在书中将JavaScript语言做了庖丁解牛式的剖析,相信即使是资深的JavaScript开发者,也一定可以找到大量闻所未闻的新内容。尤其是对闭包应用和原型继承的条分缕析,可以说是每一个想在JavaScript语言方面有所作为的开发者都必须掌握的,而这方面的资料在别处却难得一见。Christian还系统地介绍了最近才出现,但已经炙手可热的node.js服务器端JavaScript框架(你没有看错,的确是服务器端的JavaScript框架),不仅做了概念性的一般论述,更重要的是通过一个完整的项目来实地演示它的每一部分是怎样工作的。在阅读本书时,我们最深切的体会就是,Christian不喜欢说“凑字数”的话,而“那么,我们就来使用下面的代码来说明问题吧”这样的话在书中可谓俯拾皆是。所以,本书的的确确是心血之作,它绝对不是代码的堆砌,而是每一段代码精确地用来说明一个主题,而没有任何多余行。作者还煞费苦心地向读者提供了可以浏览所有代码变更的Git库,这样就更比书中的静态印刷形态能够说明重构的步骤。
  当然,本书最大的也是最核心的价值,还在于它完整地展示了将测试驱动的开发方法学应用于JavaScript开发中去,这是一种全新的尝试。对于尚不熟悉这种软件开发方法的读者来说,通过阅读本书可以达到一举两得的功效。并且,本书的亮点在于不仅展示了测试可以驱动编写新的代码,而且可以驱动旧代码的重构,这将测试驱动的适用范围大大地扩展了。事实上,测试驱动的本质是通过用例验证来保证产品代码的正确性。通过认真地阅读本书,读者可以非常详尽地了解到,如何在Web开发的过程中构建这样的用例,以编写从单个函数,到功能模块,再到完整产品的正确代码。这些宝贵经验的分享,对于Web开发者的实际工作有着直接帮助的同时,也十分有益于良好的开发习惯的培养。
  JavaScript正在日益变得更像一门C/C++那样的通用语言,它的设计中所蕴含的威力,直到最近才逐渐为人所知。特别是像jQuery这样的库出现以后,浏览器之间的差异几乎不复存在,而更多的精力则被放在用JavaScript来实现过去需要在服务器上编写大量的后端代码才能完成的工作。有一种说法,我个人认为很有道理,就是“JavaScript就是Web时代的汇编”。它正在以前所未有的速度取代服务器端用于页面生成的计算,而将大部分的计算量集中在业务逻辑和数据访问这些真正需要计算之处。掌握JavaScript语言,已经日渐成为所有Web开发的从业人员所必备的基本技能要求,那种“JavaScript仅仅是前端人员要学的东西,和后端人员无关”的想法,已经越来越落伍了。从现在就开始让自己多掌握一些JavaScript,无论之前是初学还是已经精通,本书都能够满足您的需求。
  在本书翻译的过程中,芝加哥大学博士、成都电子科技大学云计算研究中心负责人赵勇同志、盛大创新院的程德同志、EMC中国软件开发工程师朱磊同志,以及自由软件开发者凌杰同志,都付出了巨大的心血。机械工业出版社华章分社的陈冀康编辑给了我们莫大的精神支持,使得本书的翻译和统稿工作得以顺利完成。在这里我需要特别感谢盛大创新院的郭忠祥院长为我们安排了多场以HTML5为主题的专题会议,使我们能有机会和知名的Web开发者领袖Jeremy Keith先生、W3C的HTML5工作小组组长Michael Smith先生,以及北京航空航天大学驻W3C顾问委员会代表李安琪女士等当面交流,也十分感谢盛大创新院前端团队的陈柏宇和周裕波同志,他们为我们解答了不少有关JavaScript的技术问题。本书成书之前,专注于node.js的cnodejs.org社区核心成员朱彤先生,以及上海交通大学软件学院的张尧弼教授都阅读了全稿,并给了我许多可贵的修正意见,在此一并致谢。当然,由于完成统稿工作的是我本人,所以全书的质量问题理应由我负责。我也想借此机会向在工作和生活上给了我莫大支持的父母和家人表达我内心最深处的敬意和谢意,希望本书的出版能给你们带来快乐。
高博
高级研究员
2011年12月
于上海盛大集团总部

图书目录

译者序
前言
致谢
关于作者
第一部分 测试驱动开发
第1章  自动化测试 1
1.1  单元测试 1
1.1.1  单元测试框架 2
1.1.2  JavaScript日期函数strftime 2
1.2  断言 5
1.3  测试函数、用例和套件 7
1.4  集成测试 10
1.5  单元测试的好处 12
1.5.1  回归测试 12
1.5.2  重构 12
1.5.3  跨浏览器的测试 13
1.5.4  其他的一些好处 13
1.6  单元测试中的陷阱 13
1.7  小结 13
第2章  测试驱动开发的过程 15
2.1  测试驱动开发的目的与目标 15
2.1.1  开发顺序的颠倒 15
2.1.2  测试驱动开发中的设计 15
2.2  过程 16
2.2.1  步骤1:编写一个测试 17
2.2.2  步骤2:观看测试失败 17
2.2.3  步骤3:使测试通过 18
2.2.4  步骤4:重构以消除冗余 20
2.2.5  打肥皂、冲洗、重复 20
2.3  让测试驱动开发简便易行 21
2.4  测试驱动开发的好处 21
2.4.1  有效的代码 21
2.4.2  遵循单一职责原则 22
2.4.3  强制有意识的开发 22
2.4.4  提高生产效率 22
2.5  小结 22
第3章  行业工具 23
3.1  xUnit测试框架 23
3.1.1  行为驱动开发 23
3.1.2  持续集成 23
3.1.3  异步测试 24
3.1.4  xUnit测试框架的特点 24
3.1.5  断言 25
3.1.6  依赖关系 25
3.2  浏览器内的测试框架 26
3.2.1  YUI Test 26
3.2.2  其他浏览器内的测试框架 28
3.3  无头测试框架 29
3.3.1  交叉检查 29
3.3.2  Rhino与env.js 29
3.3.3  无头测试框架的缺点 30
3.4  一个掌管一切的测试运行器 30
3.4.1  JsTestDriver是怎样工作的 30
3.4.2  JsTestDriver的缺点 31
3.4.3  安装 31
3.4.4  在IDE里使用JsTestDriver 35
3.4.5  提高命令行效率 36
3.4.6  断言 37
3.5  小结 38
第4章  从测试中学习 39
4.1  用单元测试探索JavaScript 39
4.1.1  观察法编程的缺陷 41
4.1.2  学习测试的最佳点 41
4.2  性能测试 42
4.2.1  基准和相对性能 43
4.2.2  性能评测和定位瓶颈 50
4.3  小结 51
第二部分 开发人员的JavaScript
第5章  函数 53
5.1  定义函数 53
5.1.1  函数声明 53
5.1.2  函数表达式 54
5.1.3  Function构造器 55
5.2  调用函数 56
5.2.1  arguments对象 56
5.2.2  形参和arguments 57
5.3  作用域和执行上下文 58
5.3.1  执行上下文 59
5.3.2  变量对象 59
5.3.3  活动对象 60
5.3.4  全局对象 60
5.3.5  作用域链 61
5.3.6  再访函数表达式 62
5.4  this关键字 64
5.4.1  隐式地设置this 65
5.4.2  显式地设置this 65
5.4.3  使用原初类型当做this 66
5.5  小结 67
第6章  函数和闭包的应用 68
6.1  绑定函数 68
6.1.1  this被丢弃:一个Lightbox的例子 68
6.1.2  通过一个匿名函数解决this问题 69
6.1.3  Function.prototype.bind 70
6.1.4  绑定参数 71
6.1.5  局部套用 73
6.2  被立即调用的匿名函数 74
6.2.1  Ad Hoc作用域 74
6.2.2  命名空间 76
6.3  状态函数 79
6.3.1  生成唯一的标识符 79
6.3.2  迭代器 81
6.4  记忆 84
6.5  小结 86
第7章  对象和原型继承 87
7.1  对象和属性 87
7.1.1  属性访问 88
7.1.2  原型链 89
7.1.3  通过原型链实现对象扩展 90
7.1.4  可枚举属性 91
7.1.5  属性的特性 94
7.2  使用构造器创建对象 98
7.2.1  prototype和[[Prototype]] 98
7.2.2  使用new创建对象 98
7.2.3  构造器原型 99
7.2.4  构造器的问题 102
7.3  伪经典结构的继承 103
7.3.1  继承函数 104
7.3.2  访问[[Prototype]] 105
7.3.3  实现super 105
7.4  封装和信息隐藏 110
7.4.1  私有方法 110
7.4.2  私有成员和特权方法 112
7.4.3  函数式继承 113
7.5  对象组合和混搭体 115
7.5.1  Object.create方法 115
7.5.2  tddjs.extend方法 117
7.5.3  混搭体 120
7.6  小结 121
第8章  ECMAScript 5 122
8.1  JavaScript不远的未来 122
8.2  对象模型的更新 123
8.2.1  属性的特性 123
8.2.2  原型继承 125
8.2.3  Getter和Setter 127
8.2.4  使用属性的特性 128
8.2.5  作为属性标识符的保留关键字 131
8.3  严格模式 131
8.3.1  启用严格模式 131
8.3.2  严格模式带来的改变 132
8.4  各种新内容及改进 134
8.4.1  原生的JSON 134
8.4.2  Function.prototype.bind 135
8.4.3  关于数组 135
8.5  小结 135
第9章  不唐突的JavaScript 137
9.1  不唐突的JavaScript的目标 137
9.2  不唐突的JavaScript的规则 138
9.2.1  唐突的标签式面板 138
9.2.2  简洁的标签式面板标记 140
9.2.3  TDD和渐进增强 141
9.3  不要做任何假设 141
9.3.1  不要假设只有你一个人 141
9.3.2  不要假设标记是正确的 142
9.3.3  不要假设所有用户的需求都一样 142
9.3.4  不要假设支持 142
9.4  规则何时适用 143
9.5  不唐突的标签式面板的例子 143
9.5.1  建立测试 143
9.5.2  tabController对象 145
9.5.3  activateTab方法 147
9.5.4  使用标签控制器 149
9.6  小结 152
第10章  特性检测 154
10.1  浏览器嗅探 154
10.1.1  用户代理嗅探 154
10.1.2  对象检测 155
10.1.3  浏览器嗅探的状态 156
10.2  正确使用对象检测 156
10.2.1  检查对象是否存在 156
10.2.2  类型检查 157
10.2.3  原生和宿主对象 157
10.2.4  使用测试样例 160
10.2.5  何时测试 161
10.3  特性检测DOM事件 161
10.4  特性检测CSS属性 163
10.5  跨浏览器事件处理例程 164
10.6  使用特性检测 167
10.6.1  向前进 167
10.6.2  无法检测到的特性 167
10.7  小结 168
第三部分 JavaScript测试
驱动开发实践
第11章  观察者模式 169
11.1  JavaScript中的观察者 169
11.1.1  观察物库 170
11.1.2  设置环境 170
11.2  添加观察者 171
11.2.1  第一个测试 171
11.2.2  重构 173
11.3  检查观察者 174
11.3.1  测试 175
11.3.2  重构 177
11.4  通知观察者 177
11.4.1  确保观察者被调用 177
11.4.2  传递参数 178
11.5  错误处理 179
11.5.1  添加假的观察者 179
11.5.2  有问题的观察者 180
11.5.3  记录调用顺序 181
11.6  观察任意对象 182
11.6.1  让构造器成为过去式 183
11.6.2  用对象来替换构造器 185
11.6.3  重命名方法 186
11.7  观察任意事件 187
11.7.1  支持observe中的事件 187
11.7.2  支持notify中的事件 188
11.8  小结 191
第12章  抽象化浏览器区别:Ajax 192
12.1  以测试驱动来开发一个请求API 192
12.1.1  发现浏览器的不一致 192
12.1.2  开发策略 192
12.1.3  目标 193
12.2  实现请求接口 193
12.2.1  项目布局 193
12.2.2  选择接口风格 194
12.3  创建一个XMLHttpRequest对象 194
12.3.1  第一个测试 194
12.3.2  XMLHttpRequest背景知识 195
12.3.3  实现tddjs.ajax.create 196
12.3.4  更强的特性检测 197
12.4  编写Get请求 198
12.4.1  需要一个URL 198
12.4.2  为XMLHttpRequest对象
创建桩 199
12.4.3  处理状态的变化 205
12.4.4  处理状态变化 206
12.5  使用Ajax API 209
12.5.1  集成测试 210
12.5.2  测试结果 211
12.5.3  微妙的麻烦 212
12.5.4  本地请求 213
12.5.5  测试状态 214
12.6  发出POST请求 217
12.6.1  为POST做准备 217
12.6.2  发送数据 220
12.6.3  设置请求头信息 225
12.7  重审请求API 225
12.8  小结 229
第13章  使用Ajax和Comet将数据流式化 230
13.1  数据轮询 230
13.1.1  项目结构 230
13.1.2  轮询器:tddjs.ajax.poller 231
13.1.3  定时器测试 238
13.1.4  可配置的头和回调 242
13.1.5  单行接口 245
13.2  Comet 247
13.2.1  永不消失的框架 247
13.2.2  流式化XMLHttpRequest 248
13.2.3  HTML5 248
13.3  长轮询的XMLHttpRequest 248
13.3.1  实现长轮询支持 248
13.3.2  避免缓存问题 251
13.3.3  特性检测 252
13.4  Comet客户端 252
13.4.1  消息格式 253
13.4.2  介绍ajax.cometClient 254
13.4.3  分发数据 255
13.4.4  添加观察者 258
13.4.5  服务器连接 259
13.4.6  跟踪请求和接收到的数据 264
13.4.7  发布数据 267
13.4.8  特性检测 267
13.5  小结 267
第14章  基于Node.js的服务器端
JavaScript 269
14.1  Node.js运行时环境 269
14.1.1  环境设置 269
14.1.2  起点 271
14.2  控制器 272
14.2.1  CommonJS规则模块 272
14.2.2  定义模块:首测 272
14.2.3  建立控制器 273
14.2.4  基于POST方式添加消息 274
14.2.5  对请求做出响应 280
14.2.6  将应用程序用于实践 281
14.3  域模型和存储器 283
14.3.1  创建聊天室 283
14.3.2  Node中的输入输出 283
14.3.3  添加聊天信息 283
14.3.4  获取聊天信息 287
14.4  Promises 290
14.4.1  用promise重构addMessage方法 291
14.4.2  使用promise对象 294
14.5  事件产生器 295
14.5.1  让chatRoom对象成为一个事件
产生器 295
14.5.2  等待聊天信息 297
14.6  回到控制器 300
14.6.1  完成Post方法 300
14.6.2  通过GET方法输出数据流 302
14.6.3  响应头和响应体 307
14.7  小结 308
第15章  TDD与DOM操作:聊天室客户
端程序 309
15.1  客户端的蓝图 309
15.1.1  目录结构 309
15.1.2  选择方法 310
15.2  用户表单 311
15.2.1  视图的设置 311
15.2.2  处理提交事件 316
15.2.3  特征测试 324
15.3  用Node.js后端使用客户端 325
15.4  聊天信息列表 327
15.4.1  设置模型 327
15.4.2  设置视图 330
15.4.3  添加聊天信息 331
15.4.4  来自同一用户的重复内容 334
15.4.5  特征测试 335
15.4.6  动手实验 335
15.5  聊天信息表单 336
15.5.1  建立测试用例 337
15.5.2  设置视图 337
15.5.3  发布聊天信息 339
15.5.4  特征测试 342
15.6  聊天室客户端的最终版本 343
15.6.1  收尾工作 344
15.6.2  部署时的注意事项 346
15.7  小结 347
第四部分 测试模式
第16章  模拟对象和创建桩 349
16.1  测试替身概述 349
16.1.1  特技替身 349
16.1.2  假对象 350
16.1.3  哑对象 350
16.2  测试验证 351
16.2.1  状态验证 351
16.2.2  行为验证 351
16.2.3  验证策略的作用 352
16.3  桩 352
16.3.1  使用桩来避免不方便的接口 352
16.3.2  使用桩让系统通过特定代码路径 353
16.3.3  使用桩来制造麻烦 353
16.4  测试间谍 354
16.4.1  测试间接输入 354
16.4.2  检测调用细节 355
16.5  使用桩库 355
16.5.1  创建桩函数 355
16.5.2  给方法创建桩 356
16.5.3  内建行为验证 358
16.5.4  创建桩和Node.js 359
16.6  模拟对象 360
16.6.1  恢复被模拟的函数 360
16.6.2  匿名的模拟对象 361
16.6.3  多重期望 361
16.6.4  对this值的期望 362
16.7  模拟对象还是桩 363
16.8  小结 364
第17章  编写良好的单元测试 365
17.1  提高可读性 365
17.1.1  清楚地命名测试以表明意图 365
17.1.2  用设置、应用和验证块对测试
进行结构化 367
17.1.3  使用更高级的抽象保持测试的
简单性 367
17.1.4  减少重复,而不是减少明确性 369
17.2  将测试作为行为规范 370
17.2.1  一次只测试一种行为 370
17.2.2  每个行为只测试一次 371
17.2.3  在测试中隔离行为 371
17.3  与测试中的缺陷做斗争 373
17.3.1  在测试通过之前运行它们 373
17.3.2  首先编写测试 374
17.3.3  搅乱和破坏代码 374
17.3.4  使用JsLint 374
17.4  小结 375
参考文献 376

教学资源推荐
作者: Y. Daniel Liang
作者: [美]约翰·R. 莱文(John R. Levine) 著
参考读物推荐
作者: 王小科 寇长梅 等编著
作者: (美)Samuel P. Harbison III,Guy L. Steele Jr. 著
作者: 朱仲杰
作者: (美)Venkat Subramaniam 著