1. 程式人生 > >Javascript測試框架Jasmine(六):非同步程式碼測試

Javascript測試框架Jasmine(六):非同步程式碼測試

zz from:http://keenwon.com/1223.html

模擬Timeout

Jasmine Clock 可以用來測試setTimeout 和setInterval 的回撥操作。它使回撥函式同步執行,當Clock的時間超過timer的時間,回撥函式會被觸發一次。這使依賴於時間的程式碼更加易於測試。

Jasmine Clock使用jasmine.clock().install 在需要呼叫timer函式的spec和suite中初始化。在執行完測試的時候,一定要解除安裝Clock來還原timer函式。使用jasmine.clock().tick 設定時間以使註冊的回撥觸發。

describe("Jasmine Clock 測試", function() {
    var timerCallback;

    beforeEach(function() {
        timerCallback = jasmine.createSpy("timerCallback");
        jasmine.clock().install();
    });

    afterEach(function() {
        jasmine.clock().uninstall();
    });

    it("同步觸發setTimeout", function() {
        setTimeout(function() {
            timerCallback();
        }, 100);

        expect(timerCallback).not.toHaveBeenCalled();

        jasmine.clock().tick(101);

        expect(timerCallback).toHaveBeenCalled();
    });

    it("同步觸發setInterval", function() {
        setInterval(function() {
            timerCallback();
        }, 100);

        expect(timerCallback).not.toHaveBeenCalled();

        jasmine.clock().tick(101);
        expect(timerCallback.calls.count()).toEqual(1);

        jasmine.clock().tick(50);
        expect(timerCallback.calls.count()).toEqual(1);

        jasmine.clock().tick(50);
        expect(timerCallback.calls.count()).toEqual(2);
    });
});

線上演示

非同步支援

Jasmine支援測試需要執行非同步操作的specs,呼叫beforeEach , it , 和afterEach 的時候,可以帶一個可選的引數done ,當spec執行完成之後需要呼叫done 來告訴Jasmine非同步操作已經完成。預設Jasmine的超時時間是5s,可以通過全域性的jasmine.DEFAULT_TIMEOUT_INTERVAL 設定。

describe("Jasmine 非同步測試演示", function() {
    var value;

    beforeEach(function(done) {
        setTimeout(function() {
            value = 0;
            done();
        }, 1);
    });

    it("should support async execution of test preparation and expectations", function(done) {
        value++;
        expect(value).toBeGreaterThan(0);
        done();
    });

    describe("5秒鐘", function() {
        var originalTimeout;
        beforeEach(function() {
            originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
            jasmine.DEFAULT_TIMEOUT_INTERVAL = 6000;
        });

        it("takes a long time", function(done) {
            setTimeout(function() {
                done();
            }, 5000);
        });

        afterEach(function() {
            jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout;
        });
    });
});

線上測試,注意要等5s才有結果。

測試ajax回撥

describe("mocking ajax", function() {

    describe("suite wide usage", function() {

        beforeEach(function() {
            jasmine.Ajax.install();
        });

        afterEach(function() {
            jasmine.Ajax.uninstall();
        });

        it("specifying response when you need it", function() {
            var doneFn = jasmine.createSpy("success");

            var xhr = new XMLHttpRequest();
            xhr.onreadystatechange = function(arguments) {
                if (this.readyState == this.DONE) {
                    doneFn(this.responseText);
                }
            };

            xhr.open("GET", "/some/cool/url");
            xhr.send();

            expect(jasmine.Ajax.requests.mostRecent().url).toBe('/some/cool/url');
            expect(doneFn).not.toHaveBeenCalled();

            jasmine.Ajax.requests.mostRecent().response({

                "status": 200,

                "contentType": 'text/plain',

                "responseText": 'awesome response'
            });

            expect(doneFn).toHaveBeenCalledWith('awesome response');
        });

        it("allows responses to be setup ahead of time", function() {
            var doneFn = jasmine.createSpy("success");

            jasmine.Ajax.stubRequest('/another/url').andReturn({
                "responseText": 'immediate response'
            });

            var xhr = new XMLHttpRequest();
            xhr.onreadystatechange = function(arguments) {
                if (this.readyState == this.DONE) {
                    doneFn(this.responseText);
                }
            };

            xhr.open("GET", "/another/url");
            xhr.send();

            expect(doneFn).toHaveBeenCalledWith('immediate response')
        });
    });

    it("allows use in a single spec", function() {
        var doneFn = jasmine.createSpy('success');
        jasmine.Ajax.withMock(function() {
            var xhr = new XMLHttpRequest();
            xhr.onreadystatechange = function(arguments) {
                if (this.readyState == this.DONE) {
                    doneFn(this.responseText);
                }
            };

            xhr.open("GET", "/some/cool/url");
            xhr.send();

            expect(doneFn).not.toHaveBeenCalled();

            jasmine.Ajax.requests.mostRecent().response({
                "status": 200,
                "responseText": 'in spec response'
            });

            expect(doneFn).toHaveBeenCalledWith('in spec response');
        });
    });
});

線上演示


相關推薦

Javascript測試框架Jasmine非同步程式碼測試

zz from:http://keenwon.com/1223.html 模擬Timeout Jasmine Clock 可以用來測試setTimeout 和setInterval 的回撥操作。它使回撥函式同步執行,當Clock的時間超過timer的時間,回撥函式

Javascript測試框架JasminejqPaginator測試例項

zz from:http://keenwon.com/1225.html jqPaginator是我自己寫的一個分頁元件,已經用在了公司的兩個專案上。這次學習Jasmine,首先想到的就是怎麼測試下jqPaginator。 看過jqPaginator專案的都知道,它

Javascript測試框架Jasmine自定義Matcher

zz from:http://keenwon.com/1212.html 一個專案常常需要封裝自定義的Matcher來在多個spec中使用,這次講下怎麼寫相容Jasmine的自定義Matcher。 自定義的Matcher從本質上講是一個對比函式,它的函

Javascript測試框架JasmineSetup、Teardown、巢狀describe等

zz from: http://keenwon.com/1206.html 上一篇把Matcher說了說,本來該說自定義Matcher的,但是發現有些七七八八的細節沒講,那就今天先把這些基礎說了。 Setup and Teardown S

Python 各種測試框架簡介nose

調用 QQ upm href 命令 math 一點 發現 方法 轉載:https://blog.csdn.net/qq_15013233/article/details/52527260 摘要 這裏將從(pythontesting.net)陸續編譯四篇 Python 測試框

JavaScript各種繼承方式寄生組合繼承

  一 原理   用寄生繼承來改造組合繼承。   function Fruit(name){ this.name = name; } Fruit.prototype.eat = function(){ console.log('eat'); }

微服務詳解部署與測試

獨立部署和使用諸如Docker的容器來部署微服務,使用Docker將專案部署到AWS上。 可以利用Docker或者任何其他容器,可以簡化部署; 1.使用Netflix OSS的微服務架構概述 Netflix是微服務架構中的先鋒,通過他

Python3+Selenium2完整的自動化測試框架實現自動化測試環境搭建

添加 在線安裝 自動化 eight str rain 中間 自動打開 發的 1 環境搭建準備 (1) 下載Python3版本的安裝包,直接官網下載即可:Python官網:https://www.python.org/ (2) 下載Python的基礎工具包

軟件測試的藝術軟件測試的重要原則

避免 存在 更多 說明 編寫測試用例 判斷 理解 測試 重點 軟件測試是為了發現錯誤而執行程序的過程,這就說明目的是為了發現錯誤,動作是執行程序。 在進行軟件測試的過程中,要遵循很多的原則,以下是幾個重要的測試原則: 1) 測試用例中一個必需部分是對預期輸出或結果

【視訊】Kubernetes1.12從零開始程式碼編譯到自動部署

作者: 李佶澳   轉載請保留:原文地址   釋出時間:2018/11/10 16:14:00 說明 kubefromscratch-ansible和kubefromscratch介紹 使用前準備

JavaScript錯誤處理機制

image || .cn final nta 構造函數 n) 示例 發生 1.Error()構造函數 javascript解析或執行語句時,一旦發生錯誤,js引擎會將其拋出! JavaScript原生提供了Error()構造函數,所有拋出的錯誤都是這個構造函數的實例(即對象

安卓專案實戰之強大的網路請求框架okGo使用詳解擴充套件專案okServer,更強大的下載上傳功能,支援斷點和多工管理

OkGo與OkDownload的區別就是,OkGo只是簡單的做一個下載功能,不具備斷點下載,暫停等操作,但是這在很多時候已經能滿足需要了。 而有些app需要有一個下載列表的功能,就像迅雷下載一樣,每個下載任務可以暫停,可以繼續,可以重新下載,可以有下載優先順序,這時候OkDownload就有

CodeMix使用的語言和框架HTML5

使用CodeMix在Eclipse中啟動HTML5帶有CodeMix的Eclipse中的HTML5CodeMix是一個外掛,它將VS Code智慧引入Eclipse,並允許您直接從Eclipse訪問Code OSS擴充套件。 使用CodeMix,您可以獲得在Eclipse中使用HTML5時獲得卓越程式設計體驗

Java類集框架Stack及Properties子類、Collections工具類

Stack子類 在java.util包內可以利用stack類實現棧的功能。此類定義如下: public class Stack<E> extends Vector<E> Stack類常用方法: 方法 型別

javascript資料結構與演算法筆記雙向連結串列

javascript資料結構與演算法筆記(六):雙向連結串列 一:簡介 二:ES6版DoublyLinkedList類 一:簡介 雙向連結串列和普通連結串列的區別在於,在連結串列中,一個節點只有鏈向下一個節點的連結,而

深入JavaScript系列原型與原型鏈

說到JavaScript的原型和原型鏈,相關文章已有不少,但是大都晦澀難懂。本文將換一個角度出發,先理解原型和原型鏈是什麼,有什麼作用,再去分析那些令人頭疼的關係。 一、引用型別皆為物件 原型和原型鏈都是來源於物件而服務於物件的概念,所以我們要先明確一點: JavaScript中一切引用型別都是物件,物

碼不停蹄從零開始Java後臺開發,跳出寫Servlet+JDBC的坑,使用輕量級框架Spring+SpringMVC+MyBatis (SSM)

寫在前面:這篇文章是寫給剛剛接觸或者準備學習web/APP應用開發的同學的,分享我的後臺開發經驗,如果你對後臺開發沒有什麼概念,甚至剛剛學完Java的基礎語法,那麼請一定要仔細看我接下來提供的開發方案,這會幫你跳出很多坑,迅速找到入門後臺開發的路。 一、學點底

Unity 客戶端框架UI框架

public abstract class BaseUI : MonoBehaviour { #region 快取 private Transform _CachedTransform; public Transform cachedTransform

深入淺出學習Struts1框架ActionServlet的例項化

之前寫了五篇關於struts1框架學習的部落格,主要是從mvc的一個例項開始,慢慢重構出一個struts1框架雛形,通過這個雛形來引出我們要學習的struts1框架並且編寫了一個struts1例項。五篇部落格如下: 今天我們來分析一下先前的Struts1框

Javascript基礎陣列及常用操作

1、陣列的定義 一個變數裡面只能一個值,如果有1000人,想把我們每個人的人名儲存,要用變數需要 1000個變數。這個時候可以考慮陣列 。 陣列就是一個大變數, 它裡面可以儲存很多的值。 陣列物件的作用是:使用單獨的變數名來儲存一系列的值。 2、建立陣列