精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何在 AngularJS 中對控制器進行單元測試

開發 前端
開發者們都一致認為單元測試在開發項目中十分有好處。它們幫助你保證代碼的質量,從而確保更穩定的研發,即使需要重構時也更有信心。

開發者們都一致認為單元測試在開發項目中十分有好處。它們幫助你保證代碼的質量,從而確保更穩定的研發,即使需要重構時也更有信心。

 

測試驅動開發流程圖

AngularJS的代碼聲稱其較高的可測性確實是合理的。單單文檔中列出端對端的測試實例就能說明。就像AngularJS這樣的項目雖然都說單元測試 很簡單但真正做好卻不容易。即使官方文檔中以提供了詳盡的實例,但在我的實際應用中卻還是很有挑戰。這里我就簡單示范一下我是怎么操作的吧.

Instant Karma

Karma是來Angular團隊針對JavaScript開發的一個測試運行框架。它很方便的實現了自動執行測試任務從而替代了繁瑣的手工操作(好比回歸測試集或是加載目標測試的依賴關系)Karma 和Angular的協作就好比花生醬和果凍.

只需要在Karma中定義好配置文件啟動它,接下來它就會在預期的測試環境下的自動執行測試用例。你可以在配置文件中制定相關的測試環境。angular-seed,是我強烈推薦的可以快速實施的方案。在我近期的項目中Karma 的配置如下:

  1. module.exports = function(config) { 
  2.     config.set({ 
  3.         basePath: '../', 
  4.  
  5.         files: [ 
  6.             'app/lib/angular/angular.js', 
  7.             'app/lib/angular/angular-*.js', 
  8.             'app/js/**/*.js', 
  9.             'test/lib/recaptcha/recaptcha_ajax.js', 
  10.             'test/lib/angular/angular-mocks.js', 
  11.             'test/unit/**/*.js' 
  12.         ], 
  13.  
  14.         exclude: [ 
  15.             'app/lib/angular/angular-loader.js', 
  16.             'app/lib/angular/*.min.js', 
  17.             'app/lib/angular/angular-scenario.js' 
  18.         ], 
  19.  
  20.         autoWatch: true, 
  21.  
  22.         frameworks: ['jasmine'], 
  23.  
  24.         browsers: ['PhantomJS'], 
  25.  
  26.         plugins: [ 
  27.             'karma-junit-reporter', 
  28.             'karma-chrome-launcher', 
  29.             'karma-firefox-launcher', 
  30.             'karma-jasmine', 
  31.             'karma-phantomjs-launcher' 
  32.         ], 
  33.  
  34.         junitReporter: { 
  35.             outputFile: 'test_out/unit.xml', 
  36.             suite: 'unit' 
  37.         } 
  38.  
  39.     }) 

這個跟angular-seed的默認配置類似只不過有以下幾點不同:

  • 需要更改瀏覽器從Chrome 轉到PhantomJS, 這樣每次跳轉時無需再打開新的瀏覽器窗口,但在OSX系統會有窗口延遲。所以這個插件還有瀏覽器設置都做了更改。

  • 由于我的應用需要引用Google的Recaptcha服務因此添加了依賴的recaptcha_ajax.js小文件。這個小配置就像在Karma的配置文件中添加一行代碼那么簡單。

 

autoWatch確實是個很酷的設置,它會讓Karma在有文件更改時自動回歸你的測試用例。你可以這樣安裝Karma:

  1. npm install karma 

angular-seed 提供了一個簡單的腳本inscripts/test.sh去觸發Karma的測試。

用Jasmine設計測試用例

當使用Jasmine----一種行為驅動開發模式的JavaScript測試框架為Angular設計單元測試用例時大部分的資源都已可獲取。

這也就是我接下來要說的話題。

如果你要對AngularJS controller做單元測試可以利用Angular的依賴注入dependency injection 功能導入測試場景中controller需要的服務版本還能同時檢查預期的結果是否正確。例如,我定義了這個controller去高亮需要導航去的那個頁簽:

  1. app.controller('NavCtrl', function($scope, $location) { 
  2.     $scope.isActive = function(route) { 
  3.         return route === $location.path(); 
  4.     }; 
  5. }) 

如果想要測試isActive方法,我會怎么做呢?我將 檢查$locationservice 變量是否返回了預期值,方法返回的是否預期值。因此在我們的測試說明中我們會定義好局部變量保存測試過程中需要的controlled版本并在需要時注入 到對應的controller當中。然后在實際的測試用例中我們會加入斷言來驗證實際的結果是否正確。整個過程如下:

  1. describe('NavCtrl', function() { 
  2.     var $scope, $location, $rootScope, createController; 
  3.  
  4.     beforeEach(inject(function($injector) { 
  5.         $location = $injector.get('$location'); 
  6.         $rootScope = $injector.get('$rootScope'); 
  7.         $scope = $rootScope.$new(); 
  8.  
  9.         var $controller = $injector.get('$controller'); 
  10.  
  11.         createController = function() { 
  12.             return $controller('NavCtrl', { 
  13.                 '$scope': $scope 
  14.             }); 
  15.         }; 
  16.     })); 
  17.  
  18.     it('should have a method to check if the path is active', function() { 
  19.         var controller = createController(); 
  20.         $location.path('/about'); 
  21.         expect($location.path()).toBe('/about'); 
  22.         expect($scope.isActive('/about')).toBe(true); 
  23.         expect($scope.isActive('/contact')).toBe(false); 
  24.     }); 
  25. }); 

使用整個基本的結構,你就能設計各種類型的測試。由于我們的測試場景使用了本地的環境來調用controller,你也可以多加上一些屬性接著執行一個方法清除這些屬性,然后再驗證一下屬性到底有沒有被清除。

#p#

$httpBackendIs Cool

那么要是你在調用$httpservice請求或是發送數據到服務端呢?還好,Angular提供了一種

$httpBackend的mock方法。這樣的話,你就能自定義服務端的響應內容,又或是確保服務端的響應結果能和單元測試中的預期保持一致。

具體細節如下:

  1. describe('MainCtrl', function() { 
  2.     var $scope, $rootScope, $httpBackend, $timeout, createController; 
  3.     beforeEach(inject(function($injector) { 
  4.         $timeout = $injector.get('$timeout'); 
  5.         $httpBackend = $injector.get('$httpBackend'); 
  6.         $rootScope = $injector.get('$rootScope'); 
  7.         $scope = $rootScope.$new(); 
  8.  
  9.  
  10.         var $controller = $injector.get('$controller'); 
  11.  
  12.         createController = function() { 
  13.             return $controller('MainCtrl', { 
  14.                 '$scope': $scope 
  15.             }); 
  16.         }; 
  17.     })); 
  18.  
  19.     afterEach(function() { 
  20.         $httpBackend.verifyNoOutstandingExpectation(); 
  21.         $httpBackend.verifyNoOutstandingRequest(); 
  22.     }); 
  23.  
  24.     it('should run the Test to get the link data from the go backend', function() { 
  25.         var controller = createController(); 
  26.         $scope.urlToScrape = 'success.com'
  27.  
  28.         $httpBackend.expect('GET', '/slurp?urlToScrape=http:%2F%2Fsuccess.com') 
  29.             .respond({ 
  30.                 "success": true, 
  31.                 "links": ["http://www.google.com", "http://angularjs.org", "http://amazon.com"] 
  32.             }); 
  33.  
  34.         // have to use $apply to trigger the $digest which will 
  35.         // take care of the HTTP request 
  36.         $scope.$apply(function() { 
  37.             $scope.runTest(); 
  38.         }); 
  39.  
  40.         expect($scope.parseOriginalUrlStatus).toEqual('calling'); 
  41.  
  42.         $httpBackend.flush(); 
  43.  
  44.         expect($scope.retrievedUrls).toEqual(["http://www.google.com", "http://angularjs.org", "http://amazon.com"]); 
  45.         expect($scope.parseOriginalUrlStatus).toEqual('waiting'); 
  46.         expect($scope.doneScrapingOriginalUrl).toEqual(true); 
  47.     }); 
  48. }); 

正如你所見,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中所有的怪異特性和獨 特用法。因此我希望這篇文章能對你有些許幫助。

原文鏈接:http://www.oschina.net/translate/how-to-unit-test-controllers-in-angularjs-without-setting-your-hair-on-fire

責任編輯:陳四芳 來源: 開源中國編譯
相關推薦

2017-12-12 13:17:36

機器學習代碼單元測試

2012-11-01 11:32:23

IBMdw

2012-11-01 11:37:05

JavaScript單元測試測試工具

2023-12-11 08:25:15

Java框架Android

2021-03-28 23:03:50

Python程序員編碼

2019-12-18 10:25:12

機器學習單元測試神經網絡

2017-01-16 12:12:29

單元測試JUnit

2017-01-14 23:26:17

單元測試JUnit測試

2013-06-04 09:49:04

Spring單元測試軟件測試

2023-07-27 08:16:51

數據訪問層項目

2017-03-23 16:02:10

Mock技術單元測試

2017-01-14 23:42:49

單元測試框架軟件測試

2024-03-29 08:03:48

單元測試流量

2009-08-19 09:00:48

單元測試框架自動化測試

2020-09-30 08:08:15

單元測試應用

2011-04-18 13:20:40

單元測試軟件測試

2009-06-26 17:48:38

JSF項目單元測試JSFUnit

2021-03-24 09:30:02

Jupyter not單元測試代碼

2023-08-02 13:59:00

GoogleTestCTest單元測試

2011-07-13 13:13:10

域控制器活動目錄
點贊
收藏

51CTO技術棧公眾號

国产.欧美.日韩| 精品999成人| 91精品国产欧美一区二区成人| 特级毛片在线免费观看| 丰满熟妇乱又伦| 日韩精品亚洲专区| 欧美高清性猛交| 深爱五月激情网| 国产95亚洲| 欧美日韩亚洲激情| 潘金莲一级淫片aaaaa免费看| 免费观看国产视频| 美国毛片一区二区三区| 高清欧美性猛交xxxx| 在线视频第一页| 凹凸av导航大全精品| 欧美色欧美亚洲另类二区| 久久久久99精品成人片| 色综合久久久久综合一本到桃花网| 国产精品一区在线| 国产精品r级在线| 久久久久99精品| 久久国产影院| 亚洲人成电影在线播放| 亚洲一二三四五| 欧美成人免费全部网站| 欧美性色视频在线| av女优在线播放| 四季久久免费一区二区三区四区| 国产精品丝袜久久久久久app| 国产一区二区免费电影| 国产成人三级一区二区在线观看一 | 亚洲欧美日韩国产综合精品二区 | 青青草精品视频| 91sao在线观看国产| 唐朝av高清盛宴| 国产精品88久久久久久| 亚洲午夜色婷婷在线| 最新在线黄色网址| 激情视频极品美女日韩| 日韩精品中文字幕一区二区三区| www.久久av.com| 成人一区视频| 欧美视频中文一区二区三区在线观看 | 野外性满足hd| 欧美日韩精品一区二区三区在线观看| 日韩欧美国产综合| 丰满饥渴老女人hd| 日本在线成人| 日韩精品一区二区三区视频播放| 樱花草www在线| 国产精品美女久久久久| 91精品国产综合久久久蜜臀粉嫩| www.久久91| 亚洲视频自拍| 欧美一区二区性放荡片| 丰满少妇中文字幕| 超碰成人免费| 精品视频在线播放色网色视频| 女同性恋一区二区三区| 日本亚洲不卡| 亚洲欧洲日产国产网站| 欧美黄色一级生活片| 日韩专区精品| 不卡伊人av在线播放| 印度午夜性春猛xxx交| 欧美精品一级| 97超视频免费观看| 在线观看网站免费入口在线观看国内| 中文在线不卡| 7m精品福利视频导航| 中文字幕日韩一级| 亚洲永久字幕| 国产精品久久久久久婷婷天堂 | 亚洲国产综合在线看不卡| 欧美激情在线有限公司| 国产成人在线免费观看视频| 久久av一区| 国产精品亚洲аv天堂网| 国产精品羞羞答答在线| 国产91对白在线观看九色| 狠狠色综合色区| 可以直接在线观看的av| 中文字幕一区在线观看| 青青草综合视频| 嗯~啊~轻一点视频日本在线观看| 欧美日韩国产精品一区| 亚洲xxxx2d动漫1| 亚洲一区电影| 亚洲欧美日本另类| 热久久最新网址| 国产欧美va欧美va香蕉在| 日韩视频免费观看高清完整版| 国产视频视频一区| 欧美日韩亚洲一区二区三区在线| 美女视频免费精品| 日本高清不卡在线观看| 男人的天堂最新网址| 粉嫩一区二区三区四区公司1| 亚洲色图在线观看| 麻豆亚洲av熟女国产一区二| 久久久久久久高潮| 成人女人免费毛片| a√资源在线| 婷婷久久综合九色综合绿巨人| av污在线观看| 亚洲自拍电影| 米奇精品一区二区三区在线观看| 日韩 国产 欧美| 国产精品亚洲专一区二区三区| 欧美性bbwbbwbbwhd| 日本一二三不卡视频| 成人爽a毛片| 色婷婷成人综合| 高清乱码免费看污| 成人午夜视频在线观看| 亚洲一区美女| 欧美xo影院| 亚洲国产精品久久精品怡红院| 羞羞在线观看视频| 日日摸夜夜添夜夜添精品视频| 国产激情一区二区三区在线观看 | 在线亚洲男人天堂| 日韩久久精品视频| 国产酒店精品激情| 一区二区三区不卡在线| 久久精品女人天堂av免费观看| 精品国产麻豆免费人成网站| 极品美妇后花庭翘臀娇吟小说| 六月天综合网| 蜜桃久久精品乱码一区二区| www成人免费观看| 欧美变态tickling挠脚心| 精品一区二区三区蜜桃在线| 久久久久久一区二区| 久久99欧美| 深夜成人在线| 国产丝袜一区二区三区免费视频| 日韩激情在线播放| 成人性生交大合| 日本久久久网站| 大型av综合网站| 欧美激情视频一区二区| 亚洲国产日韩在线观看| 一区二区在线观看不卡| 成年人性生活视频| 欧美午夜不卡| 国产成人av一区二区三区| 欧美巨大xxxx做受沙滩| 欧美tk—视频vk| 国产一级特黄aaa大片| 成人黄色在线视频| 国产中文字幕免费观看| 亚洲va久久久噜噜噜久久| 91成人免费观看网站| 四虎精品成人免费网站| 色美美综合视频| 久久午夜精品视频| 精品在线一区二区| 亚洲国产一二三精品无码 | 天堂精品中文字幕在线| 欧美不卡1区2区3区| 亚洲精品一区三区三区在线观看| 在线性视频日韩欧美| 99精品在线看| 亚洲成国产人片在线观看| 久久久久麻豆v国产精华液好用吗| 午夜一区二区三区不卡视频| 日韩免费av电影| 国产欧美88| 午夜精品一区二区三区在线| 午夜成人鲁丝片午夜精品| 91福利在线看| 极品盗摄国产盗摄合集| 99re在线视频这里只有精品| 日本女优爱爱视频| 你懂的网址国产 欧美| 国模精品娜娜一二三区| 欧美国产日韩电影| 欧美大秀在线观看| 美女欧美视频在线观看免费 | 一本色道综合亚洲| 国产在线观看免费视频软件| 国产传媒久久文化传媒| 美女福利视频在线| 亚洲在线久久| 欧美一区二区在线视频观看| 只有精品亚洲| 欧美一区三区三区高中清蜜桃| 看女生喷水的网站在线观看| 亚洲精品v欧美精品v日韩精品| 国产精品无码一区| 亚洲成人综合网站| 日本黄区免费视频观看| k8久久久一区二区三区| 9l视频白拍9色9l视频| 91久久夜色精品国产九色| 亚洲高清视频一区二区| 国产一区调教| 成人免费观看a| 亚洲精品国产精品国产| 久久中文字幕国产| 国产精品影院在线| 亚洲第一视频网| 国产精品乱码一区二区| 色综合天天天天做夜夜夜夜做| 国内偷拍精品视频| 欧美韩国日本不卡| 蜜臀av一区二区三区有限公司| 国产精品99精品久久免费| 黄色三级视频在线| 国产情侣久久| 欧美图片激情小说| 一精品久久久| 亚洲一区二区三区精品动漫| 免费看成人哺乳视频网站| 91国产在线播放| 日本成人一区二区| 日本在线精品视频| 色一区二区三区| 午夜精品蜜臀一区二区三区免费 | 欧美美女搞黄| 亚洲第一男人av| 超碰在线播放97| 欧美剧情片在线观看| 成人一二三四区| 色悠悠久久综合| 九九热在线免费观看| 亚洲一区二区视频| 国产少妇在线观看| 亚洲精品成人少妇| www.色小姐com| 亚洲柠檬福利资源导航| 三级黄色在线观看| 国产精品视频观看| 国产精品久久久视频| 久久精品一区二区三区不卡 | 男人的天堂最新网址| 欧美a级一区二区| 国产真人无码作爱视频免费| 久久www成人_看片免费不卡| 精品视频一区二区在线| 久久久蜜桃一区二区人| 国产欧美高清在线| 日日夜夜一区二区| www.色就是色| 久久99久久99| 国产999免费视频| 国产jizzjizz一区二区| 国产精品一级无码| av中文字幕亚洲| 午夜理伦三级做爰电影| 久久精品一区四区| 中文字幕第69页| 亚洲视频中文字幕| 久久久精品国产sm调教| 亚洲国产精品久久久男人的天堂 | 国产成人亚洲欧美| 国偷自产av一区二区三区| 精品视频导航| 日韩精品久久| 日本a级片在线观看| 亚洲视频综合| 日韩一级在线免费观看| 九色|91porny| 欧美图片自拍偷拍| 久久亚洲综合av| 色欲狠狠躁天天躁无码中文字幕| 中文字幕不卡一区| 草视频在线观看| 香蕉av福利精品导航| 99久久久无码国产精品免费蜜柚 | 中文字幕亚洲日本| 91亚洲永久精品| 天堂在线中文视频| 一区二区三区日韩精品视频| 国产精品视频免费播放| 欧美在线一区二区| 午夜精品久久久久久久第一页按摩| 亚洲国产精品女人久久久| 黄色影院在线播放| 欧美成人在线免费视频| 三妻四妾的电影电视剧在线观看| 国产精品永久在线| 国产精品22p| 亚洲欧美久久久久一区二区三区| 一区视频在线看| 国产 porn| 福利一区二区在线观看| 大胸美女被爆操| 五月综合激情网| 一区二区美女视频| 亚洲精品美女在线观看播放| 欧洲不卡av| 欧美一级淫片播放口| 二区三区精品| 日产中文字幕在线精品一区| 午夜久久一区| 中文字幕免费高清在线| 99久久久久免费精品国产 | 伊人久久大香线| 亚洲精品高清无码视频| 丰满岳乱妇一区二区三区| 99精品全国免费观看| 亚洲第一主播视频| 国产孕妇孕交大片孕| 亚洲欧洲午夜一线一品| 欧美xxxx黑人又粗又长| 成人国产精品日本在线| 精品欧美激情在线观看| 黄色一级片黄色| 极品尤物av久久免费看| 久久久久亚洲av成人无码电影| 亚洲国产精品久久人人爱蜜臀 | 香蕉视频亚洲一级| 国产精品一区二区三区不卡| 久久久久免费av| 日韩爱爱小视频| 国产午夜亚洲精品理论片色戒| 中日韩精品视频在线观看| 日韩女优制服丝袜电影| 激情成人四房播| 国产自产女人91一区在线观看| 国产乱码精品一区二区三区四区| 免费成人午夜视频| 99国产精品99久久久久久| 久草福利资源在线观看| 日韩一级二级三级精品视频| www.在线视频| 亚洲精品欧美日韩专区| 91精品国产自产在线观看永久∴ | av一区二区三区| 国产第一页在线播放| 日韩午夜在线播放| 中文字幕中文字幕在线中高清免费版| 国产美女久久精品香蕉69| 欧美日韩在线观看视频小说| 福利在线一区二区三区| 国产午夜亚洲精品理论片色戒| 久久精品五月天| 国产一区二区三区久久精品| 欧美日韩美女| 日本一区网站| 欧美aa在线视频| 美女视频久久久| 日韩一区二区三| 羞羞电影在线观看www| 成人国产1314www色视频| 韩日精品在线| 人妻体内射精一区二区三区| 婷婷六月综合亚洲| 美州a亚洲一视本频v色道| 国产精品27p| 欧美激情黄色片| 波多野结衣中文字幕在线播放| 亚洲五码中文字幕| 欧美日韩激情视频一区二区三区| 日韩美女在线看| 国产韩日影视精品| 年下总裁被打光屁股sp| 欧美日韩国产一区在线| 久久电影视频| 91精品久久久久久久久青青| 伊人情人综合网| 内射中出日韩无国产剧情| 欧美中文字幕久久| 羞羞的视频在线观看| 韩日午夜在线资源一区二区| 日韩精品一级二级| 777777国产7777777| 亚洲成年人在线播放| 原纱央莉成人av片| 一区二区三区视频在线播放| 国产精品性做久久久久久| 在线观看免费国产视频| 国产亚洲精品美女久久久久| 国产一区二区三区国产精品| 缅甸午夜性猛交xxxx| 国产三级久久久| 亚洲av无码乱码国产精品| 欧美在线一级视频| 天天影视欧美综合在线观看| 久久无码人妻精品一区二区三区 | 一区二区成人在线观看| 香蕉视频国产在线| 国产在线精品播放| 在线视频精品| 欧美爱爱免费视频| 亚洲毛片在线观看.| 久久视频社区| 蜜臀久久99精品久久久酒店新书 | 不卡的av网站| 中文字幕永久免费视频| 午夜精品福利在线观看| 999精品一区| 久久av无码精品人妻系列试探| 欧美一区二区在线视频| 亚洲日本网址| 精品久久久久久久久久中文字幕| 中文字幕亚洲一区二区av在线 |