在JavaScript的AngularJS函式庫中進行單元測試的方法_AngularJS
開發者都一致認為單元測試在開發專案中十分有好處。它們幫助你確保程式碼的質量,從而確保更穩定的研發,即使需要重構時也更有信心。
測試驅動開發流程圖
AngularJS的程式碼聲稱其較高的可測性確實是合理的。單單文檔中列出端對端的測試實例就能說明。就像AngularJS這樣的專案雖然都說單元測試很簡單但真正做好卻不容易。即使官方文件中以提供了詳盡的實例,但在我的實際應用中卻還是很有挑戰。這裡我就簡單示範一下我是怎麼操作的吧.
Instant Karma
Karma 是來Angular團隊針對JavaScript開發的一個測試運行框架。它很方便的實現了自動執行測試任務從而替代了繁瑣的手工操作(好比回歸測試集或是加載目標測試的依賴關係)Karma 和Angular的協作就好比花生醬和果凍.
只需要在Karma中定義好設定檔啟動它,接下來它就會在預期的測試環境下的自動執行測試案例。你可以在設定檔中製定相關的測試環境。 angular-seed,是我強烈推薦的可以快速實施的方案。在我近期的專案中Karma 的配置如下:
module.exports = function(config) { config.set({ basePath: '../', files: [ 'app/lib/angular/angular.js', 'app/lib/angular/angular-*.js', 'app/js/**/*.js', 'test/lib/recaptcha/recaptcha_ajax.js', 'test/lib/angular/angular-mocks.js', 'test/unit/**/*.js' ], exclude: [ 'app/lib/angular/angular-loader.js', 'app/lib/angular/*.min.js', 'app/lib/angular/angular-scenario.js' ], autoWatch: true, frameworks: ['jasmine'], browsers: ['PhantomJS'], plugins: [ 'karma-junit-reporter', 'karma-chrome-launcher', 'karma-firefox-launcher', 'karma-jasmine', 'karma-phantomjs-launcher' ], junitReporter: { outputFile: 'test_out/unit.xml', suite: 'unit' } }) }
這個跟angular-seed的預設配置類似只不過有以下幾點不同:
- 需要更改瀏覽器從Chrome 轉到PhantomJS, 這樣每次跳轉時無需再打開新的瀏覽器窗口,但在OSX系統會有窗口延遲。所以這個插件還有瀏覽器設定都做了更改。
- 由於我的應用程式需要引用Google的Recaptcha服務因此新增了依賴的recaptcha_ajax.js小檔案。這個小配置就像在Karma的設定檔中加入一行程式碼那麼簡單。
autoWatch確實是個很酷的設置,它會讓Karma在有文件更改時自動回歸你的測試案例。你可以這樣安裝Karma:
npm install karma
angular-seed 提供了一個簡單的腳本inscripts/test.sh去觸發Karma的測試。
用Jasmine設計測試用例
當使用Jasmine----一種行為驅動開發模式的JavaScript測試框架為Angular設計單元測試用例時大部分的資源都已可取得。
這也就是我接下來要說的話題。
如果你要對AngularJS controller做單元測試可以利用Angular的依賴注入dependency injection 功能導入測試場景中controller需要的服務版本還能同時檢查預期的結果是否正確。例如,我定義了這個controller去高亮需要導航去的那個頁籤:
app.controller('NavCtrl', function($scope, $location) { $scope.isActive = function(route) { return route === $location.path(); }; })
如果想要測試isActive方法,我會怎麼做呢?我將檢查$locationservice 變數是否傳回了預期值,方法傳回的是否預期值。因此在我們的測試說明中我們會定義好局部變數保存測試過程中所需的controlled版本並在需要時注入到對應的controller當中。然後在實際的測試案例中我們會加入斷言來驗證實際的結果是否正確。整個過程如下:
describe('NavCtrl', function() { var $scope, $location, $rootScope, createController; beforeEach(inject(function($injector) { $location = $injector.get('$location'); $rootScope = $injector.get('$rootScope'); $scope = $rootScope.$new(); var $controller = $injector.get('$controller'); createController = function() { return $controller('NavCtrl', { '$scope': $scope }); }; })); it('should have a method to check if the path is active', function() { var controller = createController(); $location.path('/about'); expect($location.path()).toBe('/about'); expect($scope.isActive('/about')).toBe(true); expect($scope.isActive('/contact')).toBe(false); }); });
使用整個基本的結構,你就能設計各種類型的測試。由於我們的測試場景使用了本地的環境來呼叫controller,你也可以多加上一些屬性接著執行一個方法清除這些屬性,然後再驗證一下屬性到底有沒有被清除。
$httpBackendIs Cool
那麼要是你在呼叫$httpservice請求或是發送資料到服務端呢?還好,Angular提供了一種
$httpBackend的mock方法。這樣的話,你就能自訂服務端的回應內容,又或是確保服務端的回應結果能和單元測試中的預期保持一致。
具體細節如下:
describe('MainCtrl', function() { var $scope, $rootScope, $httpBackend, $timeout, createController; beforeEach(inject(function($injector) { $timeout = $injector.get('$timeout'); $httpBackend = $injector.get('$httpBackend'); $rootScope = $injector.get('$rootScope'); $scope = $rootScope.$new(); var $controller = $injector.get('$controller'); createController = function() { return $controller('MainCtrl', { '$scope': $scope }); }; })); afterEach(function() { $httpBackend.verifyNoOutstandingExpectation(); $httpBackend.verifyNoOutstandingRequest(); }); it('should run the Test to get the link data from the go backend', function() { var controller = createController(); $scope.urlToScrape = 'success.com'; $httpBackend.expect('GET', '/slurp?urlToScrape=http:%2F%2Fsuccess.com') .respond({ "success": true, "links": ["http://www.google.com", "http://angularjs.org", "http://amazon.com"] }); // have to use $apply to trigger the $digest which will // take care of the HTTP request $scope.$apply(function() { $scope.runTest(); }); expect($scope.parseOriginalUrlStatus).toEqual('calling'); $httpBackend.flush(); expect($scope.retrievedUrls).toEqual(["http://www.google.com", "http://angularjs.org", "http://amazon.com"]); expect($scope.parseOriginalUrlStatus).toEqual('waiting'); expect($scope.doneScrapingOriginalUrl).toEqual(true); }); });
如你所見,beforeEach call其實都很類似,唯一不同的是我們是從injector取得$httpBackend而並非直接取得。即使如此,在建立不同的測試時還會有一些明顯的不同之處。對初學者來說,會有一個afterEachcall 方法來確保$httpBackend在每次用例執行後不會有明顯的異常請求。如果你觀察一下測試場景的設定和$httpBackend方法的應用就會發現有那麼幾點不是那麼直覺的。
實際上呼叫$httpBackend的方法也算是簡單明了但還不夠-我們還得在傳值給$scope.$apply的方法中把呼叫封裝到實際測試中的$scope.runTest方法上。這樣在$digest被觸發後才能處理HTTP請求。而如你所見直到我們呼叫$httpBackend.flush()方法後$httpBackend才會被解析,這也就保證了我們能在呼叫過程中去驗證傳回的結果是否正確(在上面的範例中,controller的$scope.parseOriginalUrlStatusproperty屬性將傳遞給呼叫者,我們也因此能即時監控)
接下來的幾行程式碼都是在呼叫過程中偵測$scopethat屬性的斷言。很酷吧?
提示:在某些單元測試中,使用者習慣把沒有$的範圍標記為變數。這個在Angular文件中並沒有強制要求或是過度強調,只是我在使用中為了提高可讀性和一致性才使用$scopelike這種方式。
結論
也許這就是我做起來對其他人而言只是自然而然能做到的事情之一,但是學習使用Angular編寫單元測試一開始對我而言確實是相當痛苦的。我發現自己對如何開始的理解大多來自網路上各種部落格文章和資源的拼湊,沒有真正一致或明確的最佳實踐,而是透過自然而然的隨意選擇。我想針對我最終得到的成果提供一些文檔,以幫助那些也許還在坑裡面掙扎的其他人,畢竟他們只是想要編寫程式碼而已,而不是不得不去了解Angular和Jasmine中所有的怪異特性和獨特用法。因此我希望這篇文章能對你有些許幫助。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

Javascript 是一個非常有個性的語言. 無論是從程式碼的組織, 還是程式碼的程式設計範式, 或物件導向理論都獨具一格. 而很早就在爭論的Javascript 是不是物件導向語言這個問題, 顯然已有答案. 但是, 即使Javascript 叱吒風雲二十年, 如果想要看懂jQuery, Angularjs, 甚至是React 等流行框架, 觀看《黑馬雲課堂JavaScript 高級框架設計視頻教程》就對了。

在現今資訊時代,網站已成為人們獲取資訊和交流的重要工具。一個響應式的網站能夠適應各種設備,為使用者提供優質的體驗,成為了現代網站開發的熱點。本篇文章將介紹如何使用PHP和AngularJS建立響應式網站,進而提供優質的使用者體驗。 PHP介紹PHP是一種開源的伺服器端程式語言,非常適合Web開發。 PHP具有許多優點,如易於學習、跨平台、豐富的工具庫、開發效

隨著網路的不斷發展,Web應用已成為企業資訊化建設的重要組成部分,也是現代化工作的必要手段。為了讓Web應用能夠方便開發、維護和擴展,開發人員需要選擇適合自己開發需求的技術框架和程式語言。 PHP和AngularJS是兩種非常流行的Web開發技術,它們分別是伺服器端和客戶端的解決方案,透過結合使用可以大大提高Web應用的開發效率和使用體驗。 PHP的優勢PHP

隨著網路的普及,越來越多的人使用網路進行檔案傳輸和分享。然而,由於各種原因,使用傳統的FTP等方式進行檔案管理無法滿足現代使用者的需求。因此,建立一個易用、高效、安全的線上文件管理平台已成為了一種趨勢。本文介紹的線上文件管理平台,基於PHP和AngularJS,能夠方便地進行文件上傳、下載、編輯、刪除等操作,並且提供了一系列強大的功能,例如文件共享、搜尋、

隨著Web技術的快速發展,單頁Web應用程式(SinglePageApplication,SPA)已成為越來越流行的Web應用程式模型。相較於傳統的多頁Web應用程序,SPA的最大優勢在於使用者感受更加流暢,同時伺服器端的運算壓力也大幅減少。在本文中,我們將介紹如何使用Flask和AngularJS來建構一個簡單的SPA。 Flask是一款輕量級的Py

隨著Web應用程式的普及,前端框架AngularJS變得越來越受歡迎。 AngularJS是一個由Google開發的JavaScript框架,它可以幫助你建立具有動態Web應用程式功能的網頁應用程式。另一方面,對於後端編程,PHP是非常受歡迎的程式語言。如果您正在使用PHP進行伺服器端編程,那麼結合AngularJS使用PHP將可以為您的網站帶來更多的動態效

這篇文章介紹的內容是關於AngularJS基礎入門介紹,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下。

隨著網路的普及和發展,前端開發已變得越來越重要。身為前端開發人員,我們需要了解並掌握各種開發工具和技術。其中,PHP和AngularJS是兩種非常有用且受歡迎的工具。在本文中,我們將介紹如何使用這兩種工具進行前端開發。一、PHP介紹PHP是一種流行的開源伺服器端腳本語言,它適用於Web開發,可以在Web伺服器和各種作業系統上運作。 PHP的優點是簡單、快速、便
