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測試框架Jasmine(七):jqPaginator測試例項
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測試框架Jasmine(三):Setup、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、建立陣列