欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用Jasmine和Karma對AngularJS頁面程序進行測試

 更新時間:2016年03月05日 17:40:00   作者:Mahon  
這篇文章主要介紹了使用Jasmine和Karma對AngularJS頁面程序進行測試的方法,以Node.js為環(huán)境,非常適合JavaScript的全棧開發(fā)時使用,需要的朋友可以參考下

AngularJS是繼jQuery之后發(fā)生在JavaScript上最好的東西。這也是JavaScript開發(fā)一直以來想要的方式。Angular主要的優(yōu)點之一就是它的依賴注入(Dependency Injection),它非常利于代碼的單元測試。但有點小怪異的是,我在無論如何都沒能找到一個介紹如何做單元測試的教程。

當然有很多不錯的推薦:使用Jasmine測試框架和Karma測試執(zhí)行器(Test Runner);但是并沒有一篇完整的從無到有指導(dǎo)如何測試的教程。所以我寫了這篇文章。我在網(wǎng)上找了很多資源才知道如何去做,而你現(xiàn)在不需要去做這些(如果一開始就看到這篇文章的話)。

請告訴我你看到的任何錯誤,直到我能說這是基于Karma和Jasmine測試Angular應(yīng)用的最佳實踐。

介紹

這篇文章會引導(dǎo)你安裝使用Karma和Jasmine做自動化測試所需要的所有工具。我不在乎你實在使用TDD(測試驅(qū)動開發(fā))還是TAD(測試輔助開發(fā)),在這篇文章中,我假設(shè)你已經(jīng)有一個文件需要測試。

安裝Karma

如果你沒有安裝 Node.js,那么請自行下載和安裝。安裝之后,打開終端或命令行輸入一下命令:

npm install -g karma

文件結(jié)構(gòu)

文件結(jié)構(gòu)是跟我們的議題關(guān)聯(lián)不大,但是在接下來的測試中,我使用的文件結(jié)構(gòu)如下:

Application
| angular.js
| angular-resource.js
| Home
 | home.js
| Tests
 | Home
 | home.tests.js
 | karma.config.js (will be created in the next step)
 | angular-mocks.js

*我并不主張這種文檔結(jié)構(gòu),我展示它只是為了測試舉例。

配置Karma

切換到你想要放置配置文件的目錄,然后在終端中輸入下面的命令來創(chuàng)建配置文件:

karma init karma.config.js

你會被詢問一些問題,包括你想使用那個測試框架,你是否需要自動監(jiān)測文件,包含哪些測試和被測試文件等。在我們的教程中,我們保留‘Jasmine'作為我們默認的框架,開啟文件自動監(jiān)測,并包含下面的文件:

../*.js
../**.*.js
angular-mocks.js
**/*.tests.js

這些都是相對路徑,包含了1)父目錄下的所有.js文件,2)父目錄下的所有子目錄下的所有.js文件,3)當前目錄下的angular-mock.js,4)以及當前目錄(包含子目錄)下所有的.tests.js文件(我喜歡以這樣的方式來區(qū)分測試文件和其他的文件)。

不管你選擇了什么文件,請確保你引入了 angular.js,angular-mock.js,以及其他你需要使用的文件。

啟動Karma

現(xiàn)在已經(jīng)可以啟動Karma了,依然在終端中輸入:

karma start karma.config.js

這個命令會在你的電腦上啟動你在配置文件中列出的瀏覽器。這些瀏覽器都會以socket的方式連接到Karma的實例上,你會看到一組活動的瀏覽器并被告知她們是否在執(zhí)行測試。我但愿Karma已經(jīng)告訴你在每個瀏覽器上的最終測試結(jié)果總結(jié)(比如16個中的15個通過,1個失?。?,遺憾的是你只能通過終端窗口看到這些信息。

Karma的一個很突出的特色是你可以在網(wǎng)絡(luò)中使用任何設(shè)備連接并測試你的代碼。試一下將你的手機瀏覽器指向Karma服務(wù),你可以在電腦上任何一個運行的瀏覽器上找到這個測試的URL地址。它應(yīng)該類似于:http://localhost:9876/?id=5359192。你可以將你的手機,虛擬機,或其他任何設(shè)備的瀏覽器指向 [你在網(wǎng)絡(luò)上的IP地址]:9876/?id=5359192. 因為Karma是在運行一個 Node.js 實例,你的測試機器就像一個web服務(wù)器一樣,會將測試發(fā)送到任何指向它的瀏覽器。

基本的測試

我們假設(shè)你已經(jīng)有一個文件需要測試。我們要使用到的 home.js 文件如下:

home.js

'use strict';
 
var app = angular.module('Application', ['ngResource']);
 
app.factory('UserFactory', function($resource){
 return $resource('Users/users.json')
});
 
app.controller('MainCtrl', function($scope, UserFactory) {
 $scope.text = 'Hello World!';
 $scope.users = UserFactory.get();
});

我們可以在 home.test.js 文件中創(chuàng)建我們的測試用例。我們從簡單的那個測試開始:$scope.text 應(yīng)該等于 ‘Hello World!'。 為了完成這個測試,我們需要模擬我們的 Application 模塊以及 $scope 變量。我們會在Jasmine的 beforeEach 方法中做這個工作,這樣的話我們在每個測試用例開始時可以有一個全新的(干凈的)controler和scope對象。

home.tests.js

'use strict';
 
describe('MainCtrl', function(){
 var scope;
//我們會在測試中使用這個scope
 
 
//模擬我們的Application模塊并注入我們自己的依賴
 beforeEach(angular.mock.module('Application'));
 
//模擬Controller,并且包含 $rootScope 和 $controller
 beforeEach(angular.mock.inject(function($rootScope, $controller){
  
//創(chuàng)建一個空的 scope
  scope = $rootScope.$new();
  
//聲明 Controller并且注入已創(chuàng)建的空的 scope
  $controller('MainCtrl', {$scope: scope});
 });
 
// 測試從這里開始
});

從代碼中你可以看到我們注入了我們自己的 scope,因此我們可以在它的外部驗證它的信息。同時,別忘了模擬模塊本身(第7行代碼)!我們現(xiàn)在已經(jīng)為測試做好了準備:

home.tests.js

// 測試從這里開始
it('should have variable text = "Hello World!"', function(){
 expect(scope.text).toBe('Hello World!);
});

如果你運行這個測試,它可以在任何指向Karma的瀏覽器中執(zhí)行,并且測試通過。

發(fā)送$resource請求

現(xiàn)在我們已經(jīng)準備好測試 $resource 請求。要完成這個請求,我們需要使用到 $httpBackend, 它一個模擬版本的Angular $http。我們會創(chuàng)建另一個叫做 $httpBackend 的變量,在第二個 beforEach塊中,注入 _$httpBackend_ 并將新創(chuàng)建的變量指向 _$httpBackend_。接下來我們會告訴 $httpBackend 如何對請求做出響應(yīng)。

$httpBackend = _$httpBackend_; 
$httpBackend.when('GET', 'Users/users.json').respond([{id: 1, name: 'Bob'}, {id:2, name: 'Jane'}]);

我們的測試: home.tests.js

it('should fetch list of users', function(){
   $httpBackend.flush();
   expect(scope.users.length).toBe(2);
   expect(scope.users[0].name).toBe('Bob');
  });

都放到一起

home.tests.js

'use strict';
 
describe('MainCtrl', function(){
 var scope, $httpBackend;
//we'll use these in our tests
 
 
//mock Application to allow us to inject our own dependencies
 beforeEach(angular.mock.module('Application'));
 
//mock the controller for the same reason and include $rootScope and $controller
 beforeEach(angular.mock.inject(function($rootScope, $controller, _$httpBackend_){
  $httpBackend = _$httpBackend_;
  $httpBackend.when('GET', 'Users/users.json').respond([{id: 1, name: 'Bob'}, {id:2, name: 'Jane'}]);
 
  
//create an empty scope
  scope = $rootScope.$new();
  
//declare the controller and inject our empty scope
  $controller('MainCtrl', {$scope: scope});
 });
 
// tests start here
 it('should have variable text = "Hello World!"', function(){
  expect(scope.text).toBe('Hello World!');
 });
 it('should fetch list of users', function(){
  $httpBackend.flush();
  expect(scope.users.length).toBe(2);
  expect(scope.users[0].name).toBe('Bob');
 });
});

技巧

Karma會運行所有文件中的所有測試用例,如果你只想運行所有測試的一個子集,修改 describe 或 it 為 ddescribe 或 iit 來運行個別的一些測試。如果有些測試你不想運行他們,那么修改 describe 或 it 為 xdescribe 或 xit 來忽略這些代碼。

你也可以在html文件的頁面上運行你的測試。舉例的代碼如下:
home.runner.html

<!DOCTYPE html>
<html>
<head>
 <title>Partner Settings Test Suite</title>
 
<!-- include your script files (notice that the jasmine source files have been added to the project) -->
 <script type="text/javascript" src="../jasmine/jasmine-1.3.1/jasmine.js"></script>
 <script type="text/javascript" src="../jasmine/jasmine-1.3.1/jasmine-html.js"></script>
 <script type="text/javascript" src="../angular-mocks.js"></script>
 <script type="text/javascript" src="home.tests.js"></script>
 <link rel="stylesheet" href="../jasmine/jasmine-1.3.1/jasmine.css"/>
</head>
<body>
 
<!-- use Jasmine to run and display test results -->
 <script type="text/javascript">
  var jasmineEnv = jasmine.getEnv();
  jasmineEnv.addReporter(new jasmine.HtmlReporter());
  jasmineEnv.execute();
 </script>
</body>
</html>

相關(guān)文章

  • 如何使node也支持從url加載一個module詳解

    如何使node也支持從url加載一個module詳解

    這篇文章主要給大家介紹了關(guān)于如何使node也支持從url加載一個module的相關(guān)資料,文中通過示例代碼將實現(xiàn)的方法介紹非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧
    2018-06-06
  • node.js中的buffer.Buffer.byteLength方法使用說明

    node.js中的buffer.Buffer.byteLength方法使用說明

    這篇文章主要介紹了node.js中的buffer.Buffer.byteLength方法使用說明,本文介紹了buffer.Buffer.byteLength的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 我的Node.js學習之路(四)--單元測試

    我的Node.js學習之路(四)--單元測試

    在專業(yè)化的軟件開發(fā)過程中,無論什么平臺語言,現(xiàn)在都需要UnitTest單元測試. Node.js有built-in的Assert。 今天讓我們來看一下Node.js的單元測試。在這兒我們使用nodeunit
    2014-07-07
  • node使用Koa2搭建web項目的方法

    node使用Koa2搭建web項目的方法

    本篇文章主要介紹了node使用Koa2搭建web項目的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Node層模擬實現(xiàn)multipart表單的文件上傳示例

    Node層模擬實現(xiàn)multipart表單的文件上傳示例

    下面小編就為大家分享一篇Node層模擬實現(xiàn)multipart表單的文件上傳示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • Node.js+pm2+ssh2模塊實現(xiàn)簡單的自動化部署腳本

    Node.js+pm2+ssh2模塊實現(xiàn)簡單的自動化部署腳本

    本文將介紹如何使用Node.js和ssh2模塊實現(xiàn)一個簡單的部署腳本,將本地的項目文件上傳到遠程服務(wù)器上,我們將使用dotenv模塊來管理環(huán)境變量,以及child_process模塊來執(zhí)行命令行操作
    2023-10-10
  • 教你徹底搞懂ESM與CJS互相轉(zhuǎn)換

    教你徹底搞懂ESM與CJS互相轉(zhuǎn)換

    這篇文章主要為大家介紹了ESM與CJS互相轉(zhuǎn)換的理解與實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • 使用node.js 獲取客戶端信息代碼分享

    使用node.js 獲取客戶端信息代碼分享

    本文給大家分享一段使用node.js 獲取客戶端信息的代碼,非常的簡潔,推薦給大家。
    2014-11-11
  • NestJS核心概念之Middleware中間件創(chuàng)建使用示例

    NestJS核心概念之Middleware中間件創(chuàng)建使用示例

    這篇文章主要為大家介紹了NestJS核心概念之Middleware中間件創(chuàng)建使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • Mongoose經(jīng)常返回e11000 error的原因分析

    Mongoose經(jīng)常返回e11000 error的原因分析

    這篇文章主要給大家分析了Mongoose經(jīng)常返回e11000 error的原因,文中介紹的非常詳細,對大家具有一定的參考價值,需要的朋友可以們下面來一起看看吧。
    2017-03-03

最新評論