試實(shí)戰(zhàn):Karma+Jasmine從0搭建測(cè)試環(huán)境)
angular-localForage單元測(cè)試實(shí)戰(zhàn)KarmaJasmine從0搭建測(cè)試環(huán)境【免費(fèi)下載鏈接】angular-localForageAngular service directive for https://github.com/mozilla/localForage (Offline storage, improved.)項(xiàng)目地址: https://gitcode.com/gh_mirrors/an/angular-localForage想讓你的 Angular 應(yīng)用離線存儲(chǔ)代碼不再裸奔本文帶你用 Karma Jasmine 從 0 搭建一套完整的 angular-localForage 單元測(cè)試環(huán)境。angular-localForage 是一個(gè)為 AngularJS 封裝的本地存儲(chǔ)服務(wù)底層基于 localForage能自動(dòng)選擇 IndexedDB、WebSQL 或 localStorage 中最優(yōu)方案存儲(chǔ)數(shù)據(jù)。通過本文的 Karma 測(cè)試配置、依賴安裝和測(cè)試用例拆解即使是新手也能快速跑通第一輪單元測(cè)試讓每次改動(dòng)都有自動(dòng)化保障。為什么單元測(cè)試對(duì) angular-localForage 如此重要angular-localForage 暴露了大量異步 APIsetItem、getItem、removeItem、pull、iterate、bind等。這些方法全部基于 Promise還涉及實(shí)例管理、事件廣播、$promise字段清洗等細(xì)節(jié)手工驗(yàn)證極易遺漏邊界情況。搭建單元測(cè)試后你可以一鍵驗(yàn)證讀寫數(shù)據(jù)的正確性包括對(duì)象、數(shù)組、Date、Blob 等復(fù)雜類型異常分支如 key 未定義時(shí)是否拋錯(cuò)事件通知如LocalForageModule.setItem是否被正確廣播多實(shí)例管理如同名實(shí)例沖突是否拋出預(yù)期錯(cuò)誤從0搭建測(cè)試環(huán)境的核心依賴清單項(xiàng)目在 package.json 中聲明了完整的測(cè)試依賴核心包括karma測(cè)試運(yùn)行器負(fù)責(zé)啟動(dòng)瀏覽器并執(zhí)行用例karma-jasmine與jasmine-coreJasmine 測(cè)試框架karma-chrome-launcher、karma-firefox-launcher瀏覽器啟動(dòng)器angular-mocksAngularJS 測(cè)試輔助庫(kù)提供module與inject方法localforage被測(cè)庫(kù)底層依賴安裝完成后package.json中已配置好測(cè)試腳本{ scripts: { test: karma start ./karma.conf.js, dev-test: karma start ./karma.conf.js --browsers\Firefox,Chrome\ } }Karma配置文件逐行解析karma.conf.js 是整個(gè)測(cè)試環(huán)境的樞紐核心配置如下frameworks: [jasmine], files: [ ./bower_components/angular/angular.js, ./bower_components/angular-mocks/angular-mocks.js, ./bower_components/localforage/dist/localforage.js, ./src/angular-localForage.js, ./tests/**/*.js, ], reporters: [progress], port: 9876, browsers: [Firefox], singleRun: true,幾個(gè)關(guān)鍵點(diǎn)值得新手注意加載順序決定成敗必須先加載angular.js再加載angular-mocks.js然后是localforage.js與angular-localForage.js最后才是測(cè)試文件。順序錯(cuò)亂會(huì)導(dǎo)致angular is not defined或module is not defined報(bào)錯(cuò)。singleRun: true跑完一輪測(cè)試后自動(dòng)退出適合 CI 集成開發(fā)時(shí)可用autoWatch監(jiān)聽文件變更自動(dòng)重跑。端口 9876Karma 默認(rèn)端口若被占用可通過port修改。最快上手三個(gè)步驟跑通第一輪測(cè)試第一步獲取項(xiàng)目源碼將倉(cāng)庫(kù)克隆到本地git clone https://gitcode.com/gh_mirrors/an/angular-localForage第二步安裝依賴項(xiàng)目同時(shí)使用 npm 與 bower 管理依賴分別執(zhí)行安裝命令即可npm install bower install第三步運(yùn)行測(cè)試npm test如果本地沒有 Firefox也可以改用 Chromenpm run dev-test看到類似SUCCESS的輸出就說明你的 Karma Jasmine 測(cè)試環(huán)境搭建成功了。測(cè)試用例結(jié)構(gòu)拆解從describe到it項(xiàng)目在 tests 目錄下按功能拆分了 5 個(gè)測(cè)試文件結(jié)構(gòu)非常清晰tests/instance.js實(shí)例創(chuàng)建與獲取tests/item.js數(shù)據(jù)的增刪改查與迭代tests/bind.jsscope 雙向綁定tests/driver.js驅(qū)動(dòng)選擇相關(guān) APItests/functional.js端到端功能測(cè)試一個(gè)典型的測(cè)試用例長(zhǎng)這樣describe(Module: LocalForageModule, Item, function () { var $localForage; var $rootScope; beforeEach(module(app)); beforeEach(inject(function ($injector) { $localForage $injector.get($localForage); $rootScope $injector.get($rootScope); })); describe(#setItem, function () { it(should throw with an undefined key, function () { expect($localForage.setItem).toThrow(); }); }); });單元測(cè)試中的三大實(shí)戰(zhàn)技巧技巧一用 module 和 inject 注入服務(wù)beforeEach(module(app))加載被測(cè)模塊inject則從$injector中取出$localForage、$rootScope等依賴這是 AngularJS 單元測(cè)試的標(biāo)準(zhǔn)姿勢(shì)。技巧二用 spyOn 模擬異步依賴localForage 底層方法全部返回 Promise測(cè)試時(shí)用spyOn配合$q模擬返回值避免真實(shí)讀寫瀏覽器存儲(chǔ)spyOn($window.localforage, getItem).and.returnValue($q.resolve(4));再通過$rootScope.$digest()手動(dòng)觸發(fā) digest 循環(huán)讓 Promise 鏈完成結(jié)算從而穩(wěn)定斷言最終結(jié)果。技巧三覆蓋異常與邊界分支item.js 中大量用例專門測(cè)試錯(cuò)誤場(chǎng)景例如 key 未定義時(shí)拋出You must define a key to get數(shù)組 key 與數(shù)組 value 長(zhǎng)度不匹配時(shí)拋出錯(cuò)誤。這些邊界用例正是單元測(cè)試的價(jià)值所在。與構(gòu)建流程集成gulp與CI項(xiàng)目在 gulpfile.js 中提供了karma任務(wù)可在gulp build時(shí)先跑測(cè)試再打包。由于singleRun: true測(cè)試天然適合接入 CI每次提交代碼后自動(dòng)執(zhí)行npm test任何回歸都會(huì)被第一時(shí)間攔截。小結(jié)通過本文你已經(jīng)掌握了一套完整的 angular-localForage 單元測(cè)試搭建方法理解 Karma 配置文件的關(guān)鍵項(xiàng)、完成依賴安裝、讀懂測(cè)試用例結(jié)構(gòu)并學(xué)會(huì)用 spy 模擬異步依賴?,F(xiàn)在就去克隆項(xiàng)目跑通你的第一輪測(cè)試讓離線存儲(chǔ)代碼從此高枕無(wú)憂?!久赓M(fèi)下載鏈接】angular-localForageAngular service directive for https://github.com/mozilla/localForage (Offline storage, improved.)項(xiàng)目地址: https://gitcode.com/gh_mirrors/an/angular-localForage創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考