《编写可靠的JavaScript代码 测试驱动开发JavaScript商业软件》分为5个部分:
第Ⅰ一部分“确立牢靠的基本”包含了计算机专业的重要定义,比如SOLID和DRY原则,还探讨了模块测试和测试驱动开发的优势。
在第Ⅱ一部分“测试根据方式的代码”中,大家叙述并应用测试驱动开发建立了好多个有用的代码方式。
第Ⅲ一部分“测试和撰写高級JavaScript特性”叙述了怎么使用和测试JavaScript語言更高級的特性。
第Ⅳ一部分“测试中的独特主题”出示了测试DOM实际操作的示例,还演试了用以提高代码规范的静态数据分析工具的应用。
第Ⅴ一部分“小结”回望了测试驱动开发的定义,还展现了一些这书采用的JavaScript习语。
目录
- 第Ⅰ部分 奠定坚实的基础
- 第1章 实践软件工程 3
- 1.1 编写从开始就正确的代码 4
- 1.1.1 掌握JavaScript的特性 4
- 1.1.2 在大型系统中规避JavaScript陷阱 15
- 1.1.3 应用软件工程原则 17
- 1.2 编写保持正确的代码 22
- 1.2.1 投资单元测试的未来 22
- 1.2.2 实践测试驱动开发 22
- 1.2.3 编写易于测试的代码 23
- 1.3 小结 26
- 第2章 准备工具 27
- 2.1 使用测试框架 27
- 2.1.1 辨别不正确的代码 30
- 2.1.2 可测试性设计 32
- 2.1.3 编写最少的代码 33
- 2.1.4 安全维护和重构 33
- 2.1.5 可运行规范 34
- 2.1.6 当前的开源和商业框架 34
- 2.1.7 介绍Jasmine 36
- 2.2 使用依赖注入框架 41
- 2.2.1 依赖注入的定义 41
- 2.2.2 使用依赖注入让代码更可靠 43
- 2.2.3 掌握依赖注入 43
- 2.2.4 案例研究:编写一个轻量级依赖注入框架 43
- 2.2.5 使用依赖注入框架 50
- 2.2.6 当前的依赖注入框架 52
- 2.3 使用切面工具 53
- 2.3.1 案例研究:使用和不使用AOP进行缓存 53
- 2.3.2 案例研究:构建Aop.js模块 55
- 2.3.3 其他AOP库 67
- 2.3.4 结论 68
- 2.4 使用代码检查工具 68
- 2.4.1 使用linting工具让代码更可靠 68
- 2.4.2 JSHint简介 71
- 2.4.3 其他工具 73
- 2.4.4 严格模式 74
- 2.5 小结 74
- 第3章 构造可靠的对象 75
- 3.1 使用原生数据 75
- 3.2 使用对象字面量 77
- 3.3 使用模块模式 78
- 3.3.1 创建任意模块 78
- 3.3.2 创建立即执行模块 79
- 3.3.3 创建可靠的模块 80
- 3.4 使用对象原型和原型继承 80
- 3.4.1 默认对象原型 80
- 3.4.2 原型继承 81
- 3.4.3 原型链 82
- 3.5 使用new创建对象 83
- 3.6 使用类继承 88
- 3.6.1 模拟类继承 88
- 3.6.2 重复将杀死Kangaroo 89
- 3.7 使用函数式继承 91
- 3.8 猴子补丁(Monkey-Patching) 92
- 3.9 小结 95
- 第Ⅱ部分 测试基于模式的代码
- 第4章 浏览各种模式的优点 99
- 4.1 案例分析 99
- 4.2 通过更广泛的词汇产生更加优雅的代码 100
- 4.3 使用拥有良好设计、良好测试的构建块产生可靠的代码 101
- 4.4 小结 102
- 第5章 确保回调模式的正确使用 103
- 5.1 通过单元测试了解回调模式 104
- 5.1.1 编写和测试使用了回调函数的代码 104
- 5.1.2 编写和测试回调函数 109
- 5.2 避免问题 113
- 5.2.1 扁平化回调箭头 113
- 5.2.2 注意this变量 115
- 5.3 小结 119
- 第6章 确保承诺模式的正确使用 121
- 6.1 通过单元测试了解承诺 122
- 6.1.1 使用承诺 122
- 6.1.2 构造和返回承诺 127
- 6.1.3 测试XMLHttpRequest 130
- 6.2 串联承诺 133
- 6.3 使用承诺封装器 134
- 6.4 了解状态和命运 135
- 6.5 区分标准承诺和jQuery承诺 135
- 6.6 小结 136
- 第7章 确保正确使用散函数应用程序 137
- 7.1 对散函数应用程序进行单元测试 137
- 7.2 为散函数应用程序创建切面 139
- 7.3 区分散函数应用程序和柯里化 140
- 7.3.1 柯里化 140
- 7.3.2 散函数应用程序 141
- 7.4 小结 141
- 第8章 确保备忘录模式的正确使用 143
- 8.1 通过单元测试了解备忘录模式 144
- 8.2 使用AOP添加备忘录 147
- 8.2.1 创建备忘录切面 147
- 8.2.2 为restaurantApi应用returnValueCache切面 150
- 8.3 小结 152
- 第9章 确保单例模式的正确实现 153
- 9.1 通过单元测试了解单例模式 154
- 9.1.1 使用对象字面量实现单例共享缓存 154
- 9.1.2 使用模块实现单例共享缓存 158
- 9.2 小结 162
- 第10章 确保工厂模式的正确实现 163
- 10.1 为工厂编写单元测试 163
- 10.2 实现工厂模式 169
- 10.3 考虑其他工厂类型 171
- 10.4 小结 171
- 第11章 确保沙箱模式的正确实现和使用 173
- 11.1 通过单元测试了解沙箱模式 173
- 11.1.1 创建部件沙箱 174
- 11.1.2 创建和测试沙箱工具 187
- 11.1.3 创建与沙箱一起使用的函数 191
- 11.2 小结 193
- 第12章 确保装饰器模式的正确实现 195
- 12.1 使用测试驱动的方式开发装饰器 196
- 12.1.1 为被装饰的对象编写一个假对象 197
- 12.1.2 为错误的传递编写测试 198
- 12.1.3 编写空白装饰器 199
- 12.1.4 添加传递功能到装饰器 200
- 12.1.5 验证成功传递 202
- 12.1.6 添加装饰器的特性 204
- 12.1.7 通用化装饰器 210
- 12.2 小结 211
- 第13章 确保策略模式的正确实现 213
- 13.1 通过单元测试了解该模式 213
- 13.1.1 在不使用策略模式的情况下实现transportScheduler 214
- 13.1.2 使用策略模式实现transportScheduler 216
- 13.2 小结 227
- 第14章 确保代理模式的正确实现 229
- 14.1 通过测试驱动的方式开发代理 230
- 14.2 小结 245
- 第15章 确保正确实现可链接方法 247
- 15.1 通过单元测试了解该模式 248
- 15.2 链接then方法 255
- 15.3 小结 257
- 第Ⅲ部分 测试和编写高级JavaScript特性
- 第16章 在无接口语言中遵守接口 261
- 16.1 了解接口的优点 262
- 16.2 了解接口隔离原则 263
- 16.3 使用测试驱动开发创建契约注册表 265
- 16.3.1 定义契约 266
- 16.3.2 判断是否履行了契约 267
- 16.3.3 断言契约被履行了 271
- 16.3.4 绕过契约执行 273
- 16.3.5 创建在被返回(创建)的对象上实施契约的切面 273
- 16.4 小结 277
- 第17章 确保正确的参数类型 279
- 17.1 了解JavaScript无类型参数带来的机会和风险 280
- 17.2 扩展ContractRegistry检查参数 280
- 17.2.1 界定任务范围 280
- 17.2.2 判断集合中的所有变量是否都履行了它的契约 281
- 17.2.3 断言集合中的所有变量都履行了它的契约 289
- 17.2.4 在切面中打包参数检查功能 290
- 17.3 支持契约库 292
- 17.4 综合起来 293
- 17.4.1 创建契约模块 293
- 17.4.2 创建应用程序的ContractRegistry 296
- 17.4.3 为生产发布绕过契约 297
- 17.5 比较面向切面的解决方案和静态解决方案 297
- 17.5.1 考虑TypeScript的优点 297
- 17.5.2 考虑切面的优点 297
- 17.6 小结 298
- 第18章 确保正确使用call、apply和bind 299
- 18.1 浏览this是如何绑定的 299
- 18.1.1 默认绑定 300
- 18.1.2 隐式绑定 302
- 18.1.3 new绑定 303
- 18.1.4 显式绑定 305
- 18.2 创建和测试使用call、apply和bind的代码 305
- 18.2.1 使用call和apply 305
- 18.2.2 使用测试驱动开发创建一个Array.prototype.forEach Polyfill 307
- 18.2.3 使用bind 316
- 18.3 小结 321
- 第19章 确保正确使用方法借用 323
- 19.1 确保借用对象符合需求 324
- 19.1.1 让被借用的函数验证借用者的资格 324
- 19.1.2 向被借用的对象附加切面 326
- 19.1.3 使用borrow()方法 329
- 19.1.4 在ContractRegistry中添加对象验证器 330
- 19.2 预期借用者的副作用 331
- 19.2.1 考虑被隔离函数的副作用 331
- 19.2.2 考虑调用其他函数的函数的副作用 332
- 19.3 预期捐赠者对象的副作用 338
- 19.4 小结 339
- 第20章 确保正确使用混合 341
- 20.1 创建和使用混合 343
- 20.1.1 创建和使用传统混合 344
- 20.1.2 创建和使用函数式混合 361
- 20.2 小结 367
- 第21章 测试高级程序架构 369
- 21.1 确保观察者模式的可靠使用 369
- 21.1.1 检查观察者模式 370
- 21.1.2 增强观察者模式的可靠性 376
- 21.2 确保中介者模式的可靠使用 380
- 21.2.1 了解中介者模式 381
- 21.2.2 增强基于中介者代码的可靠性 382
- 21.3 小结 395
- 第Ⅳ部分 测试中的特殊主题
- 第22章 测试DOM访问 399
- 22.1 对UI进行单元测试 399
- 22.1.1 检查难于测试的UI代码 400
- 22.1.2 使用TDD创建UI组件 401
- 22.2 使用分析器优化代码 411
- 22.2.1 检测低效代码 411
- 22.2.2 避免不成熟的优化 418
- 22.3 小结 418
- 第23章 确保符合标准 419
- 23.1 使用ESLint 420
- 23.1.1 安装ESLint 420
- 23.1.2 运行ESLint 424
- 23.1.3 使用ESLint实施代码标准 427
- 23.2 实施架构分离 432
- 23.2.1 家庭秘密技术 433
- 23.2.2 铭记技术 435
- 23.2.3 不可能任务(Mission Impossible)技术 437
- 23.2.4 魔术棒(Magic Wand)
- 技术 441
- 23.2.5 不要使用调用栈技术 442
- 23.2.6 其他技术 442
- 23.2.7 其他架构 442
- 23.3 小结 443
- 第Ⅴ部分 总结
- 第24章 测试驱动开发原则的总结 447
- 24.1 回顾值得使用测试驱动开发的原因 447
- 24.2 练习测试驱动开发 448
- 24.3 编写可单元测试的代码 448
- 24.4 掌握测试驱动开发的
- 技术 448
- 24.4.1 在编码之前编写测试 448
- 24.4.2 保持测试DRY 449
- 24.4.3 首先测试错误条件 449
- 24.4.4 测试要先易后难 449
- 24.4.5 具体 449
- 24.4.6 只测试一件事情 450
- 24.4.7 测试数据如同测试一样重要 450
- 24.4.8 高效地使用Jasmine 450
- 24.5 测试本书描述的模式 450
- 24.5.1 测试面向切面编程 450
- 24.5.2 测试对象构造 451
- 24.5.3 测试回调 451
- 24.5.4 测试基于承诺的代码 451
- 24.5.5 测试散函数应用程序 451
- 24.5.6 测试备忘录模式 452
- 24.5.7 测试单例模式 452
- 24.5.8 测试工厂模式 452
- 24.5.9 测试沙箱 452
- 24.5.10 测试装饰器模式 453
- 24.5.11 测试策略模式 453
- 24.5.12 测试代理模式 453
- 24.5.13 测试可链接方法 453
- 24.5.14 测试接口一致性 453
- 24.5.15 测试call和apply的
- 使用 453
- 24.5.16 测试方法借用模式 454
- 24.5.17 测试混合 454
- 24.5.18 测试中介者和观察者模式 454
- 24.5.19 测试DOM访问 454
- 24.5.20 实施架构分离的测试 454
- 24.6 小结 455
- 第25章 本书JavaScript习语的总结 457
- 25.1 回顾对象 457
- 25.1.1 可以添加和删除的对象属性 457
- 25.1.2 可以将对象用作词典 458
- 25.2 回顾变量 459
- 25.2.1 提升变量声明 459
- 25.2.2 变量有函数作用域 460
- 25.3 回顾函数 463
- 25.3.1 函数是对象 463
- 25.3.2 提升函数声明 463
- 25.3.3 函数没有返回类型 464
- 25.3.4 函数可以是匿名的 465
- 25.3.5 函数可以被嵌套 465
- 25.3.6 函数调用可以使用任意数量的参数 466
- 25.3.7 函数可以立即被调用 467
- 25.4 回顾布尔操作 468
- 25.4.1 在测试相等性时类型可能会被强制转换 468
- 25.4.2 值可以是真或假 469
- 25.5 小结 469