編寫可靠的JavaScript代碼:測試驅動開發JavaScript商業軟件
內容描述
<內容簡介>
為了構建更健壯的大型JavaScript應用程序,應先測試,後編碼
資深開發人員仍然在與大型JavaScript應用程序的失敗做鬥爭,而這往往是由於應用程序自身的規模而導致的。本書以測試驅動工作流的形式提供瞭解決方案,它將產生經得起時間考驗的健壯應用程序。本書將使用單元測試解釋、演示和採用各種JavaScript模式和結構。隨著本書的學習,你將成為JavaScript測試驅動開發的專家,勝任開發商業軟件。如果準備在JavaScript開發中引入高級軟件工程,那麼本書正是最佳之選。
主要特色
◆展示瞭如何編寫開始就被確認為正確的代碼,並使用測試讓代碼在接下來的維護過程中仍然保持正確
◆概述用於測試、依賴註入和麵向方面編程的JavaScript框架目前的現狀
◆解釋可測試性特徵以及構建可測試對象的方式
◆演示常見設計模式以及高級JavaScript特性和架構的實現和使用
◆涵蓋DOM訪問測試,包括過度更新、在循環中的過度訪問以及XHR/JSONP請求
<章節目錄>
第Ⅰ部分奠定堅實的基礎
第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