<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        angularjs中的單元測試實例_AngularJS

        來源:懂視網 責編:小采 時間:2020-11-27 21:29:41
        文檔

        angularjs中的單元測試實例_AngularJS

        angularjs中的單元測試實例_AngularJS:當ng項目越來越大的時候,單元測試就要提上日程了,有的時候團隊是以測試先行,有的是先實現功能,后面再測試功能模塊,這個各有利弊,今天主要說說利用karma和jasmine來進行ng模塊的單元測試. 什么是Karma karma是一個單元測試的運行控制框架,提供以不同環境來運
        推薦度:
        導讀angularjs中的單元測試實例_AngularJS:當ng項目越來越大的時候,單元測試就要提上日程了,有的時候團隊是以測試先行,有的是先實現功能,后面再測試功能模塊,這個各有利弊,今天主要說說利用karma和jasmine來進行ng模塊的單元測試. 什么是Karma karma是一個單元測試的運行控制框架,提供以不同環境來運

        當ng項目越來越大的時候,單元測試就要提上日程了,有的時候團隊是以測試先行,有的是先實現功能,后面再測試功能模塊,這個各有利弊,今天主要說說利用karma和jasmine來進行ng模塊的單元測試.

        什么是Karma

        karma是一個單元測試的運行控制框架,提供以不同環境來運行單元測試,比如chrome,firfox,phantomjs等,測試框架支持jasmine,mocha,qunit,是一個以nodejs為環境的npm模塊.

        安裝測試相關的npm模塊建議使用----save-dev參數,因為這是開發相關的,一般的運行karma的話只需要下面兩個npm命令
        代碼如下:
        npm install karma --save-dev
        npm install karma-junit-reporter --save-dev

        安裝karma的時候會自動的安裝一些常用的模塊,參考karma代碼里的package.json文件的peerDependencies屬性

        代碼如下:
        "peerDependencies": {
        "karma-jasmine": "~0.1.0",
        "karma-requirejs": "~0.2.0",
        "karma-coffee-preprocessor": "~0.1.0",
        "karma-html2js-preprocessor": "~0.1.0",
        "karma-chrome-launcher": "~0.1.0",
        "karma-firefox-launcher": "~0.1.0",
        "karma-phantomjs-launcher": "~0.1.0",
        "karma-script-launcher": "~0.1.0"
        }

        然后一個典型的運行框架通常都需要一個配置文件,在karma里可以是一個karma.conf.js,里面的代碼是一個nodejs風格的,一個普通的例子如下:
        代碼如下:
        module.exports = function(config){
        config.set({
        // 下面files里的基礎目錄
        basePath : '../',
        // 測試環境需要加載的JS信息
        files : [
        'app/bower_components/angular/angular.js',
        'app/bower_components/angular-route/angular-route.js',
        'app/bower_components/angular-mocks/angular-mocks.js',
        'app/js/**/*.js',
        'test/unit/**/*.js'
        ],
        // 是否自動監聽上面文件的改變自動運行測試
        autoWatch : true,
        // 應用的測試框架
        frameworks: ['jasmine'],
        // 用什么環境測試代碼,這里是chrome`
        browsers : ['Chrome'],
        // 用到的插件,比如chrome瀏覽器與jasmine插件
        plugins : [
        'karma-chrome-launcher',
        'karma-firefox-launcher',
        'karma-jasmine',
        'karma-junit-reporter'
        ],
        // 測試內容的輸出以及導出用的模塊名
        reporters: ['progress', 'junit'],
        // 設置輸出測試內容文件的信息
        junitReporter : {
        outputFile: 'test_out/unit.xml',
        suite: 'unit'
        }

        });
        };

        這里要注意的時,上面的插件大部分都不需要單獨安裝,因為安裝karma的時候已經安裝了,這里只有karma-junit-reporter導出插件需要單獨安裝,想要了解更多的關于配置文件的信息可以,點擊這里

        karma就講到這里,想了解更多關于它的信息可以,點擊這里

        什么是jasmine

        Jasmine is a behavior-driven development framework for testing JavaScript code. It does not depend on any other JavaScript frameworks. It does not require a DOM. And it has a clean, obvious syntax so that you can easily write tests.

        上面是jasmine官方文檔里對它的解釋,下面用中文簡單的翻譯下

        jasmine是一個行為驅動開發的測試框架,不依賴任何js框架以及dom,是一個非常干凈以及友好API的測試庫.

        下面簡單的以一個例子來說明它的用法

        定義一個測試文件命令為test.js
        代碼如下:
        describe("A spec (with setup and tear-down)", function() {
        var foo;

        beforeEach(function() {
        foo = 0;
        foo += 1;
        });

        afterEach(function() {
        foo = 0;
        });

        it("is just a function, so it can contain any code", function() {
        expect(foo).toEqual(1);
        });

        it("can have more than one expectation", function() {
        expect(foo).toEqual(1);
        expect(true).toEqual(true);
        });
        });

        上面的例子來自于官網,這里只說下幾個重要的API,更多的用法請,點擊這里

        1.首先任何一個測試用例以describe函數來定義,它有兩參數,第一個用來描述測試大體的中心內容,第二個參數是一個函數,里面寫一些真實的測試代碼

        2.it是用來定義單個具體測試任務,也有兩個參數,第一個用來描述測試內容,第二個參數是一個函數,里面存放一些測試方法

        3.expect主要用來計算一個變量或者一個表達式的值,然后用來跟期望的值比較或者做一些其它的事件

        4.beforeEach與afterEach主要是用來在執行測試任務之前和之后做一些事情,上面的例子就是在執行之前改變變量的值,然后在執行完成之后重置變量的值

        最后要說的是,describe函數里的作用域跟普通JS一樣都是可以在里面的子函數里訪問的,就像上面的it訪問foo變量

        想要運行上面的測試例子可以通過karar來運行,命令例子如下:

        代碼如下:
        karma start test/karma.conf.js

        下面我們重點的說說ng里的控制器,指令,服務模塊的單元測試.

        NG的單元測試

        因為ng本身框架的原因,模塊都是通過di來加載以及實例化的,所以為了方便配合jasmine來編寫測試腳本,所以官方提供了angular-mock.js的一個測試工具類來提供模塊定義,加載,注入等.

        下面說說ng-mock里的一些常用方法

        1.angular.mock.module 此方法同樣在window命名空間下,非常方便調用

        module是用來配置inject方法注入的模塊信息,參數可以是字符串,函數,對象,可以像下面這樣使用
        代碼如下:
        beforeEach(module('myApp.filters'));

        beforeEach(module(function($provide) {
        $provide.value('version', 'TEST_VER');
        }));

        它一般用在beforeEach方法里,因為這個可以確保在執行測試任務的時候,inject方法可以獲取到模塊配置

        1.angular.mock.inject 此方法同樣在window命名空間下,非常方便調用

        inject是用來注入上面配置好的ng模塊,方面在it的測試函數里調用,常見的調用例子如下:

        代碼如下:
        angular.module('myApplicationModule', [])
        .value('mode', 'app')
        .value('version', 'v1.0.1');


        describe('MyApp', function() {

        // You need to load modules that you want to test,
        // it loads only the "ng" module by default.
        beforeEach(module('myApplicationModule'));


        // inject() is used to inject arguments of all given functions
        it('should provide a version', inject(function(mode, version) {
        expect(version).toEqual('v1.0.1');
        expect(mode).toEqual('app');
        }));


        // The inject and module method can also be used inside of the it or beforeEach
        it('should override a version and test the new version is injected', function() {
        // module() takes functions or strings (module aliases)
        module(function($provide) {
        $provide.value('version', 'overridden'); // override version here
        });

        inject(function(version) {
        expect(version).toEqual('overridden');
        });
        });
        });

        上面是官方提供的一些inject例子,代碼很好看懂,其實inject里面就是利用angular.inject方法創建的一個內置的依賴注入實例,然后里面的模塊注入跟普通ng模塊里的依賴處理是一樣的

        簡單的介紹完ng-mock之后,下面我們分別以控制器,指令,過濾器來編寫一個簡單的單元測試.

        ng里控制器的單元測試

        定義一個簡單的控制器
        代碼如下:
        var myApp = angular.module('myApp',[]);

        myApp.controller('MyController', function($scope) {
        $scope.spices = [{"name":"pasilla", "spiciness":"mild"},
        {"name":"jalapeno", "spiciness":"hot hot hot!"},
        {"name":"habanero", "spiciness":"LAVA HOT!!"}];
        $scope.spice = "hello feenan!";
        });

        然后我們編寫一個測試腳本
        代碼如下:
        describe('myController function', function() {

        describe('myController', function() {
        var $scope;

        beforeEach(module('myApp'));

        beforeEach(inject(function($rootScope, $controller) {
        $scope = $rootScope.$new();
        $controller('MyController', {$scope: $scope});
        }));

        it('should create "spices" model with 3 spices', function() {
        expect($scope.spices.length).toBe(3);
        });

        it('should set the default value of spice', function() {
        expect($scope.spice).toBe('hello feenan!');
        });
        });

        });

        上面利用了$rootScope來創建子作用域,然后把這個參數傳進控制器的構建方法$controller里去,最終會執行上面的控制器里的方法,然后我們檢查子作用域里的數組數量以及字符串變量是否跟期望的值相等.

        想要了解更多關于ng里的控制器的信息,可以點擊這里

        ng里指令的單元測試

        定義一個簡單的指令

        代碼如下:
        var app = angular.module('myApp', []);

        app.directive('aGreatEye', function () {
        return {
        restrict: 'E',
        replace: true,
        template: '

        lidless, wreathed in flame, 1 times

        '
        };
        });

        然后我們編寫一個簡單的測試腳本

        代碼如下:
        describe('Unit testing great quotes', function() {
        var $compile;
        var $rootScope;

        // Load the myApp module, which contains the directive
        beforeEach(module('myApp'));

        // Store references to $rootScope and $compile
        // so they are available to all tests in this describe block
        beforeEach(inject(function(_$compile_, _$rootScope_){
        // The injector unwraps the underscores (_) from around the parameter names when matching
        $compile = _$compile_;
        $rootScope = _$rootScope_;
        }));

        it('Replaces the element with the appropriate content', function() {
        // Compile a piece of HTML containing the directive
        var element = $compile("")($rootScope);
        // fire all the watches, so the scope expression 1 will be evaluated
        $rootScope.$digest();
        // Check that the compiled element contains the templated content
        expect(element.html()).toContain("lidless, wreathed in flame, 2 times");
        });
        });

        上面的例子來自于官方提供的,最終上面的指令將會這用在html里使用

        代碼如下:

        測試腳本里首先注入$compile與$rootScope兩個服務,一個用來編譯html,一個用來創建作用域用,注意這里的_,默認ng里注入的服務前后加上_時,最后會被ng處理掉的,這兩個服務保存在內部的兩個變量里,方便下面的測試用例能調用到

        $compile方法傳入原指令html,然后在返回的函數里傳入$rootScope,這樣就完成了作用域與視圖的綁定,最后調用$rootScope.$digest來觸發所有監聽,保證視圖里的模型內容得到更新

        然后獲取當前指令對應元素的html內容與期望值進行對比.

        想要了解更多關于ng里的指令的信息,可以點擊這里

        ng里的過濾器單元測試

        定義一個簡單的過濾器
        代碼如下:
        var app = angular.module('myApp', []);
        app.filter('interpolate', ['version', function(version) {
        return function(text) {
        return String(text).replace(/\%VERSION\%/mg, version);
        };
        }]);

        然后編寫一個簡單的測試腳本
        代碼如下:
        describe('filter', function() {
        beforeEach(module('myApp'));


        describe('interpolate', function() {

        beforeEach(module(function($provide) {
        $provide.value('version', 'TEST_VER');
        }));


        it('should replace VERSION', inject(function(interpolateFilter) {
        expect(interpolateFilter('before %VERSION% after')).toEqual('before TEST_VER after');
        }));
        });
        });

        上面的代碼先配置過濾器模塊,然后定義一個version值,因為interpolate依賴這個服務,最后用inject注入interpolate過濾器,注意這里的過濾器后面得加上Filter后綴,最后傳入文本內容到過濾器函數里執行,與期望值進行對比.

        總結

        利用測試來開發NG有很多好處,可以保證模塊的穩定性,還有一點就是能夠深入的了解ng的內部運行機制,所以建議用ng開發的同學趕緊把測試補上吧!

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        angularjs中的單元測試實例_AngularJS

        angularjs中的單元測試實例_AngularJS:當ng項目越來越大的時候,單元測試就要提上日程了,有的時候團隊是以測試先行,有的是先實現功能,后面再測試功能模塊,這個各有利弊,今天主要說說利用karma和jasmine來進行ng模塊的單元測試. 什么是Karma karma是一個單元測試的運行控制框架,提供以不同環境來運
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 久久久影院亚洲精品| 在线亚洲精品自拍| 久久精品亚洲精品国产色婷| 日韩电影免费在线观看网址 | 亚洲午夜无码AV毛片久久| 直接进入免费看黄的网站| 免费一级国产生活片| 亚洲狠狠婷婷综合久久| 日韩一级免费视频| 久久亚洲精品成人无码| 免费国产高清视频| 成人免费观看男女羞羞视频| 亚洲欧洲精品成人久久奇米网 | 亚洲国产精品成人综合久久久| 亚洲精品视频免费在线观看| 亚洲国产亚洲片在线观看播放| 精品成在人线AV无码免费看 | 免费人成网站在线播放| 一级A毛片免费观看久久精品 | 国精无码欧精品亚洲一区| 无码免费一区二区三区免费播放| 中文字幕亚洲综合久久| 97无码免费人妻超级碰碰碰碰| 国产亚洲一卡2卡3卡4卡新区| 美女黄网站人色视频免费国产| 亚洲AV无码一区二区一二区 | 亚洲成av人影院| 97在线观看永久免费视频| 亚洲精品天堂成人片AV在线播放| 亚洲黄黄黄网站在线观看| 中文在线观看国语高清免费| 亚洲美女人黄网成人女| 国产无遮挡又黄又爽免费视频 | 久久久亚洲欧洲日产国码是AV| 成人免费午夜无码视频| 美女裸免费观看网站| 国产免费拔擦拔擦8x| 一本色道久久88—综合亚洲精品 | 亚洲国产成人精品电影| 日韩精品视频免费在线观看| aa级女人大片喷水视频免费|