国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Ajax單元測試傻瓜教程

30e8336b8229 / 1788人閱讀

摘要:原文出處單元測試傻瓜教程請求經常容易發生錯誤,客戶端發送的數據出問題,服務器端返回的數據有誤都會導致請求錯誤。設置在我們開始單元測試之前,我們需要安裝幾個必須的工具。我們將用它來向你們展示如何對進行單元測試。

原文出處 :AJAX單元測試傻瓜教程

Ajax 請求經常容易發生錯誤,客戶端發送的數據出問題,服務器端返回的數據有誤都會導致 Ajax 請求錯誤。你不能保證與服務器的連接總是工作正常。Ajax請求需要將用戶的輸入發送給服務器并返回服務器響應,因此,對于數據的正確處理至關重要。
但是由于Ajax是異步的,測試它的同時必須保證獨立性,我們如何才能在Ajax與服務器進行通信的時候對其進行單元測試呢?
不要怕,讓我們看一看接下來的例子,學習一下如何對Ajax請求進行單元測試。

設置

在我們開始單元測試之前,我們需要安裝幾個必須的工具。

新建一個目錄,用來存放必要的文件

使用 npm install mocha chai sinon 安裝 Mocha, Chai, Sinon

測試運行器

為了使事情簡單,我們將直接在瀏覽器中運行測試。如果你更喜歡基于命令行的測試的話,測試運行的結果也將會和瀏覽器中的結果完全一致。
我們將會使用以下的文件作為測試運行器。我將其命名為test.html



    
        Mocha Tests
        
    
    
        

注意mocha.js,mocha.css,sinon-1.17.1.js,chai.js的文件路徑。因為我是用npm安裝它們的,所以它們都在node_modules目錄下。對于 Sinon,你可能需要更改文件名來匹配安裝的版本,我在這里使用的是版本是1.17.1。同時也注意testApi.js,test.js這兩個文件,這兩個文件作為我的實例模塊和測試用例,我將會在接下來逐一介紹它們。

實例模塊

接下來,我們將創建一個基礎的模塊,該模塊將會發送一些Ajax請求。我們將用它來向你們展示如何對Ajax進行單元測試。
我們將該文件命名為testApi.js

var testApi = {
    get: function(callback) {
        var xhr = new XMLHttpRequest();
        xhr.open("GET", "http://jsonplaceholder.typicode.com/posts/1", true);

        xhr.onreadystatechange = function() {
            if(xhr.readyState == 4) {
                if(xhr.status == 200) {
                    callback(null, JSON.parse(xhr.responseText));
                }
                else {
                    callback(xhr.status);
                }
            }
        };

        xhr.send();
    },

    post: function(data, callback) {
        var xhr = new XMLHttpRequest();
        xhr.open("POST", "http://jsonplaceholder.typicode.com/posts", true);

        xhr.onreadystatechange = function() {
            if(xhr.readyState == 4) {
                callback();
            }
        };

        xhr.send(JSON.stringify(data));
    }
};

這段代碼開起來應該很熟悉,我們寫了兩個函數,一個函數中使用GET方法獲取數據,另一個函數中使用POST方法向服務器發送數據,這些都是最普通的 Ajax請求。我們在這里使用了JSONPlaceholder API,它是一個免費的在線REST服務,你可以使用它提供的模擬數據,非常適合快速測試。

測試用例框架

之后我們需要創建一個框架,在里面添加每個情景的測試集。該文件被命名為test.js

chai.should();

describe("TestAPI", function() {
  //Tests etc. go here
});

Mocha中使用describe來創建一個測試用例,該測試用例便是我們添加測試代碼的地方。
chai.should()將允許我們使用 "should style" 斷言。這意味著我們可以輕松的驗證我們的測試結果,如:someValue.should.equal(12345)

測試GET請求

我們的示例模塊中有一個get函數,該函數可以被用來加載服務器傳送過來的數據。我們將會創建一個測試函數來證明由服務器取到數據是一個JSON數據。但是該GET請求是由XMLHttpRequest發出的,由于我們測試的時候并沒有服務器接收我們的數據,所以我們不能真的發出一個 Http 請求,那么我們如何才能避免真的發出請求呢?又如何能得到返回的數據呢?
別著急,這個時候就到了 Sinon 出場了。我們一開始在就在test.html中引用了 Sinon 的庫,有了 Sinon,我們就可以模擬服務器響應。我們可以將XMLHttpRequest用一個替身來代替,我們稱之為 fake XMLHttpRequest,這樣我們就能在測試中輕松控制Ajax請求了。
我們需要稍微更新一下我們的測試用例框架,以下是更改之后的test.js文件。

chai.should();

describe("TestAPI", function() {
    beforeEach(function() {
        this.xhr = sinon.useFakeXMLHttpRequest();

        this.requests = [];
        this.xhr.onCreate = function(xhr) {
            this.requests.push(xhr);
        }.bind(this);
    });

    afterEach(function() {
        this.xhr.restore();
    });


    //Tests etc. go here
});

beforeEachafterEach就像他們的名字一樣,將會在每一次的測試前和測試后被調用。在每一個測試之前,我們實例化了一個 fake XMLHttpRequest 并且將每一個被創建的 fake request 放入了一個數組中,這些值被存儲在this.xhrthis.request中,這樣我們就可以在該測試中的其他函數中使用了。

在每一次測試之后,我們使用了this.xhr.restore來恢復初始的XMLHttpRequest對象。

現在,我們可以開始在test.js中寫下我們的第一個測試集:

it("should parse fetched data as JSON", function(done) {
    var data = { foo: "bar" };
    var dataJson = JSON.stringify(data);

    testApi.get(function(err, result) {
        result.should.deep.equal(data);
        done();
    });

    this.requests[0].respond(200, { "Content-Type": "text/json" }, dataJson);
});

我們定義了一個對象data和它的JSON版本dataJson作為我們將要傳遞的數據。下一步,我們調用了testApi.call,在它的回掉函數中我們使用了result.should.deep.equal來驗證結果是不是與我們所期望的數據一致。我們還調用了done(),它的作用是告訴 Mocha 該異步測試完成了。在這里,要注意done是測試函數中的一個參數。
最后,我們調用了this.requests[0].respond。你還記得之前的beforeEach函數么?它在每一次的測試開始之前,將所有的 fake XMLHttpRquest 放入了this.requests中。當我們的測試調用testApi.get時,它創建了一個請求。這個請求被存入了this.requests這個數組中,this.requests[0]就代表了這個請求。
通常來說,XMLHttpRequest 沒有respond函數,這里的respond用來響應一個 fake request。我們在該響應中設置狀態碼為200,意思是成功響應。同時,我們將響應頭中的Content-Type設置為text/json,這是因為我們傳遞的是 JSON 數據。respond函數中的最后一個參數表示響應體,我們將其設置為之前創建好的dataJson變量。
fake XMLHttpRequest 模擬了一個 GET 請求的響應,在得到響應之后,testApi.get中的回掉函數將會被調用。該回調函數中,我們將響應中得到的結果與data變量做對比:

testApi.get(function(err, result) {
    result.should.deep.equal(data);
    done();
});

因為之前我們創建了datadataJson變量來代表傳遞的數據,所以如果響應正確,響應的數據應該被解析成一個對象。
現在,我們可以在瀏覽器中運行我們的測試了,打開test.html文件,你應該可以看到關于測試通過的信息。

測試POST請求

在我們的示例中還有一個向服務器發送數據的post函數,發送的數據是 JSON 格式的。接下來我們就要完成對該函數的測試。

it("should send given data as JSON body", function() {
    var data = { hello: "world" };
    var dataJson = JSON.stringify(data);

    testApi.post(data, function() { });

    this.requests[0].requestBody.should.equal(dataJson);
});

就和之前一樣,我們首先定義了一個測試數據data和它的 JSON 格式的變量dataJson。之后我們調用了testApi.post。與之前測試 GET 請求不一樣的地方是,這一次我們只需要驗證要被發送的數據是否被正確的轉換成了 JSON 格式,因為我們只需要保證 POST 請求中發出的數據是正確的,因此我們的回掉函數是空的。
該段代碼中最后一行使用了一個斷言來確定發送數據的正確性。與之前一樣,我們使用了 fake XMLHttpRequest,但是這一次我們要證明它攜帶了正確的數據。POST 請求中攜帶的數據存放在 fake XMLHttpRequest 的 requestBody屬性中,我們將其與dataJson作比較來驗證我們的行為。

錯誤測試

作為最后一個示例,讓我們來是測試一個失敗的請求。因為網絡連接中可能出現很多問題,同時服務器也可能出現問題,并且我們不應該讓我們網站的用戶對具體的錯誤信息感到疑惑,所以錯誤測試非常重要。
示例模塊中的回調函數中有兩個參數,第一個參數就是錯誤信息,第二個參數則是每一次 Http 請求響應得到的結果。代碼如下:

it("should return error into callback", function(done) {
    testApi.get(function(err, result) {
        err.should.exist;
        done();
    });

    this.requests[0].respond(500);
});

由于是錯誤測試,所以這一次我們不需要任何數據。我們調用了testApi.get,并在其回掉函數中來驗證 error 參數的存在。為了模擬響應錯誤,最后一行中的 fake XMLHttpRequest 發送了一個內部服務器錯誤的狀態碼 500 來觸發錯誤處理程序。

總結

Ajax請求的測試是很重要的,如果你能證明每一次請求都是正確的,那么你應用程序中的其他部分就能完全相信每一次 Ajax 請求得到的數據。
假如你正在使用 JQuery Ajax,測試的方法與例子的方法是一模一樣的。你同樣可以使用 Sinon 中的 fake XMLHttpRequests。
當然,Sinon 中并不只有 fake XMLHttpRequest, 它還有 fake Server 用來模擬服務器響應,感興趣的話可以去 Sinon 的官網了解。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/86217.html

相關文章

  • 前端資源系列(4)-前端學習資源分享&前端面試資源匯總

    摘要:特意對前端學習資源做一個匯總,方便自己學習查閱參考,和好友們共同進步。 特意對前端學習資源做一個匯總,方便自己學習查閱參考,和好友們共同進步。 本以為自己收藏的站點多,可以很快搞定,沒想到一入匯總深似海。還有很多不足&遺漏的地方,歡迎補充。有錯誤的地方,還請斧正... 托管: welcome to git,歡迎交流,感謝star 有好友反應和斧正,會及時更新,平時業務工作時也會不定期更...

    princekin 評論0 收藏0
  • linux寶塔面板安裝傻瓜教程:寶塔Linux面板7.6.0安裝教程

    摘要:一鍵配置寶塔面板怎么安裝到數據盤教程二個命令寶塔面板怎么安裝到數據盤教程二個命令今天,剛買了一臺香港云服務器,系統盤是,數據盤是,安裝寶塔面板之后發現磁盤的容量不對Linux寶塔面板安裝傻瓜教程:寶塔Linux面板7.6.0安裝教程1.介紹寶塔Linux面板7.4.5版本是基于Centos開發的,為了最好的兼容性,請優先考慮使用Centos8.x系統系統兼容性順序:Centos8.x > C...

    番茄西紅柿 評論0 收藏2637
  • PHPRAP v1.0.3 發布,修復BUG和新增部分功能

    摘要:,是一個輕量級開源接口文檔管理系統,致力于減少前后端溝通成本,提高團隊協作開發效率,打造版的。官方網站演示網站作者博客官方群 PHPRAP,是一個PHP輕量級開源API接口文檔管理系統,致力于減少前后端溝通成本,提高團隊協作開發效率,打造PHP版的RAP。 更新記錄 【修復】修復安裝步驟第一步conpile目錄權限檢測錯誤的BUG 【修復】修復mock規則類型不存在時報錯的BUG 【...

    Apollo 評論0 收藏0
  • PHPRAP v1.0.3 發布,修復BUG和新增部分功能

    摘要:,是一個輕量級開源接口文檔管理系統,致力于減少前后端溝通成本,提高團隊協作開發效率,打造版的。官方網站演示網站作者博客官方群 PHPRAP,是一個PHP輕量級開源API接口文檔管理系統,致力于減少前后端溝通成本,提高團隊協作開發效率,打造PHP版的RAP。 更新記錄 【修復】修復安裝步驟第一步conpile目錄權限檢測錯誤的BUG 【修復】修復mock規則類型不存在時報錯的BUG 【...

    idealcn 評論0 收藏0
  • PHPRAP v1.0.3 發布,修復BUG和新增部分功能

    摘要:,是一個輕量級開源接口文檔管理系統,致力于減少前后端溝通成本,提高團隊協作開發效率,打造版的。官方網站演示網站作者博客官方群 PHPRAP,是一個PHP輕量級開源API接口文檔管理系統,致力于減少前后端溝通成本,提高團隊協作開發效率,打造PHP版的RAP。 更新記錄 【修復】修復安裝步驟第一步conpile目錄權限檢測錯誤的BUG 【修復】修復mock規則類型不存在時報錯的BUG 【...

    jayzou 評論0 收藏0

發表評論

0條評論

30e8336b8229

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<