摘要:介紹是基于測(cè)試框架行為驅(qū)動(dòng)測(cè)試的定義它是通過(guò)用自然語(yǔ)言書(shū)寫(xiě)非程序員可讀的測(cè)試用例擴(kuò)展了測(cè)試驅(qū)動(dòng)開(kāi)發(fā)方法行為驅(qū)動(dòng)開(kāi)發(fā)人員使用混合了領(lǐng)域中統(tǒng)一的語(yǔ)言的母語(yǔ)語(yǔ)言來(lái)描述他們的代碼的目的函數(shù)包含兩個(gè)參數(shù)一個(gè)測(cè)試套件的名稱實(shí)現(xiàn)測(cè)試套件的代碼塊函數(shù)定義
介紹
Jasmine 是基于 BBD (behavior-driven development)測(cè)試框架
Suites and Specs行為驅(qū)動(dòng)測(cè)試的定義:它是通過(guò)用自然語(yǔ)言書(shū)寫(xiě)非程序員可讀的測(cè)試用例擴(kuò)展了測(cè)試驅(qū)動(dòng)開(kāi)發(fā)方法, 行為驅(qū)動(dòng)開(kāi)發(fā)人員使用混合了領(lǐng)域中統(tǒng)一的語(yǔ)言的母語(yǔ)語(yǔ)言來(lái)描述他們的代碼的目的
describe 函數(shù)包含兩個(gè)參數(shù)
string name 一個(gè)測(cè)試套件的名稱
function fn 實(shí)現(xiàn)測(cè)試套件的代碼塊
it 函數(shù)定義兩個(gè)參數(shù)
string name spec的標(biāo)題
function fn spec的函數(shù)
expect 函數(shù) 接收一個(gè) value, 返回一個(gè)鏈?zhǔn)狡ヅ鋵?duì)象
擁有以下匹配規(guī)則函數(shù)
toBe // 引用全等
toEqual // 深度遍歷,值全等
toMatch // 正則匹配, 支持字符串和正則表達(dá)式
toContain (字符串, 數(shù)組)
toBeNull // === null
toBeTruthy // Boolean(expect) === true
toBeLessThan // expect < value
toBeDefined // expect !== undefined
toBeUndefined // expect === undefined
toBeFalsy // Boolean(expect) === false
toBeGreaterThan // expect > value
toBeCloseTo // value - precision <= expect < value + precision
toThrow // expect throw "xx"
toThrowError expect throw type or match error message
fail 函數(shù), 直接指定spec的錯(cuò)誤原因
describe("A spec using the fail function", function() { var foo = function(x, callBack) { if (x) { callBack(); } }; it("should not call the callBack", function() { foo(false, function() { fail("Callback has been called"); }); }); });
一個(gè)suite 可以有多個(gè) describe, 一個(gè) describe 可以有多個(gè) it, 一個(gè)it 可以有多個(gè) expect
任何匹配表達(dá)式都可以有not前綴對(duì)象, 表示與期待的相反. 如
describe("a suite", function () { it("should not equal false if expect is true", function () { expect(true).not.toBe(false); }); });Setup and Teardown
在一個(gè)describe中, 單元測(cè)試中的的 多個(gè)it, 有共同的需要初始化的情況。集中初始化和卸載
beforeEach (describe 執(zhí)行后,it 執(zhí)行前調(diào)用)
afterEach (每一個(gè) it 執(zhí)行后調(diào)用)
beforeAll (describe 執(zhí)行后,it 執(zhí)行前調(diào)用,只調(diào)用一次)
afterAll (所有 it執(zhí)行完成后調(diào)用)
this在beforeEach, it, afterEach, 共享獨(dú)立的空this對(duì)象
嵌套 describe塊beforeEach, afterEach 只針對(duì)同級(jí)describe函數(shù)作用域
describe("A spec", 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); }); describe("nested inside a second describe", function() { var bar; beforeEach(function() { bar = 1; }); it("can reference both scopes as needed", function() { expect(foo).toEqual(bar); }); }); });Disabling Suites
使用 xdescribe 函數(shù) 可以跳過(guò)當(dāng)前的測(cè)試套件
Pending Specs使用 xit表示 該行為測(cè)試待規(guī)范,跳過(guò)測(cè)試
SpiesspyOn函數(shù)具有監(jiān)控對(duì)象的函數(shù)是否調(diào)用的功能, spy化的對(duì)象函數(shù), 允許有以下的匹配函數(shù)
toHaveBeenCalled // 匹配是否調(diào)用
toHaveBeenCalledTimes // 匹配調(diào)用次數(shù)
toHaveBeenCalledWith // 匹配被調(diào)用的函數(shù)參數(shù)是否與預(yù)訂的一致
spy化后的函數(shù),可以指定執(zhí)行的返回值
var foo = { setBar: function(value) { bar = value; }, getBar: function() { return bar; } }; spyOn(foo, "getBar").and.returnValue(745); fetchedBar = foo.getBar(); // fetchBar is 745
spy化的函數(shù)
and.returnValue (返回值)
and.throwError (拋出異常)
and.callThrough (直接返回調(diào)用結(jié)果)
and.returnValues (返回一個(gè)數(shù)組)
and.callFake (通過(guò)回調(diào)篡改返回值)
and.stub (凍結(jié)spy化的函數(shù)執(zhí)行)
and.identity (返回一個(gè)name)
spy 其它跟蹤屬性
calls.any() (return true表示被調(diào)用過(guò), return false 表示從未調(diào)用過(guò))
calls.count() (返回調(diào)用的次數(shù))
calls.argsFor(index) (數(shù)組的形式返回某一次調(diào)用的入?yún)ⅲ?/p>
calls.allArgs() (二維數(shù)組的形式返回所有調(diào)用的入?yún)?
calls.all() (返回一個(gè)或多個(gè){object: xx, args: [], returnValue: xx}的對(duì)象,多個(gè)由數(shù)組表示)
calls.mostRecent() (返回最近的一個(gè)調(diào)用上下文對(duì)象)
calls.first() (返回第一次調(diào)用的上下文對(duì)象)
calls.reset() (清空跟蹤數(shù)據(jù))
createSpy 與 createSpyObjspyOn 是基于操作對(duì)象的函數(shù)調(diào)用進(jìn)行tracking, 而jasmine.createSpy則是創(chuàng)建一個(gè)空的tracking函數(shù), jasmine.createSpyObj 可以為創(chuàng)建一個(gè)對(duì)象,擁有多個(gè)tracking的函數(shù)
封裝匹配 value的函數(shù)jasmine.any (匹配相同class)
jasmine.anything (匹配 非 null, undefined 的所有值)
jasmine.objectContaining (匹配對(duì)象局部的key, value)
jasmine.arrayContaining (匹配數(shù)組的某些項(xiàng))
jasmine.stringMatching (匹配局部字符串)
Custom asymmetric equality tester自定義匹配規(guī)則, 傳入一個(gè)對(duì)象, 對(duì)象中的 asymmetricMatch 是一個(gè)函數(shù),其中入?yún)⒈硎疽ε嗯嗟?b>value
Jasmine Clockjasmine.clock().install 時(shí)間記錄啟動(dòng), jasmine.clock().tick(millsecond) 多少毫秒后,調(diào)用后續(xù)的expect
Mocking the Date 異步支持 Asynchronous SupportbeforeAll, afterAll, beforeEach, afterEach, it 支持函數(shù)第一個(gè)參數(shù) done 進(jìn)行回調(diào)
describe("A spec using done.fail", function() { var foo = function(x, callBack1, callBack2) { if (x) { setTimeout(callBack1, 0); } else { setTimeout(callBack2, 0); } }; it("should not call the second callBack", function(done) { foo(true, done, function() { done.fail("Second callback has been called"); } ); }); });
done.fail 返回錯(cuò)誤的執(zhí)行
相關(guān)資料BDD介紹
Jasmine文檔
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/85051.html
摘要:只測(cè)試指定測(cè)試套件同一層級(jí)中出現(xiàn)兩個(gè)測(cè)試將忽略同理,同一層級(jí)出現(xiàn)和,將會(huì)忽略案例忽略該測(cè)試忽略該測(cè)試忽略該測(cè)試自定義比較函數(shù)覆蓋比較函數(shù)在聲明周期使用,返回或,如果返回或則表示使用默認(rèn)的進(jìn)行比較自定義匹配規(guī)則在聲明周期使用加入自定義匹配規(guī)則 focus spec 只測(cè)試指定測(cè)試套件, 同一層級(jí)中出現(xiàn) it, fit 兩個(gè)測(cè)試 spec, 將忽略 it, 同理,同一層級(jí)出現(xiàn) descri...
摘要:只測(cè)試指定測(cè)試套件同一層級(jí)中出現(xiàn)兩個(gè)測(cè)試將忽略同理,同一層級(jí)出現(xiàn)和,將會(huì)忽略案例忽略該測(cè)試忽略該測(cè)試忽略該測(cè)試自定義比較函數(shù)覆蓋比較函數(shù)在聲明周期使用,返回或,如果返回或則表示使用默認(rèn)的進(jìn)行比較自定義匹配規(guī)則在聲明周期使用加入自定義匹配規(guī)則 focus spec 只測(cè)試指定測(cè)試套件, 同一層級(jí)中出現(xiàn) it, fit 兩個(gè)測(cè)試 spec, 將忽略 it, 同理,同一層級(jí)出現(xiàn) descri...
摘要:框架本身可以很好地支持自下而上的單元測(cè)試。在中,這些原因可以分為性能真實(shí)的操作,依靠定時(shí)行為及網(wǎng)絡(luò)活動(dòng)減慢了測(cè)試隔離單元測(cè)試應(yīng)把重點(diǎn)放在小的一塊功能成為可能,并解耦不可靠的或低依賴使用對(duì)象是擁抱和的基本組成部分。 最近在慢慢深入Backbone,也試著寫(xiě)一些測(cè)試,找一些合適的文檔來(lái)學(xué)習(xí)。于是就找到了一個(gè)系列的文章 : Testing Backbone applications with...
摘要:而測(cè)試驅(qū)動(dòng)開(kāi)發(fā)技術(shù)并不只是單純的測(cè)試工作。需求向來(lái)就是軟件開(kāi)發(fā)過(guò)程中感覺(jué)最不好明確描述易變的東西。這里說(shuō)的需求不只是指用戶的需求,還包括對(duì)代碼 可能很多人和我一樣, 首次聽(tīng)到前端架構(gòu)這個(gè)詞, 第一反應(yīng)是: 前端還有架構(gòu)這一說(shuō)呢? 在后端開(kāi)發(fā)領(lǐng)域, 系統(tǒng)規(guī)劃和可擴(kuò)展性非常關(guān)鍵, 因此架構(gòu)師備受重視, 早在開(kāi)發(fā)工作啟動(dòng)之前, 他們就被邀請(qǐng)加入到項(xiàng)目中, 而且他們會(huì)跟客戶討論即將建成的平臺(tái)的...
摘要:而測(cè)試驅(qū)動(dòng)開(kāi)發(fā)技術(shù)并不只是單純的測(cè)試工作。需求向來(lái)就是軟件開(kāi)發(fā)過(guò)程中感覺(jué)最不好明確描述易變的東西。這里說(shuō)的需求不只是指用戶的需求,還包括對(duì)代碼 可能很多人和我一樣, 首次聽(tīng)到前端架構(gòu)這個(gè)詞, 第一反應(yīng)是: 前端還有架構(gòu)這一說(shuō)呢? 在后端開(kāi)發(fā)領(lǐng)域, 系統(tǒng)規(guī)劃和可擴(kuò)展性非常關(guān)鍵, 因此架構(gòu)師備受重視, 早在開(kāi)發(fā)工作啟動(dòng)之前, 他們就被邀請(qǐng)加入到項(xiàng)目中, 而且他們會(huì)跟客戶討論即將建成的平臺(tái)的...
閱讀 2494·2021-10-09 09:59
閱讀 2275·2021-09-23 11:30
閱讀 2665·2019-08-30 15:56
閱讀 1209·2019-08-30 14:00
閱讀 3007·2019-08-29 12:37
閱讀 1329·2019-08-28 18:16
閱讀 1715·2019-08-27 10:56
閱讀 1087·2019-08-26 17:23