單元測試之?dāng)嘌?/h2>
作為前端開發(fā),很少去自己寫單元測試篷帅。對于單元測試的了解也很少史侣,自學(xué)了一點(diǎn)關(guān)于單元測試斷言的知識拴泌,有了一些自己的個人理解,記錄下來惊橱,方便下次使用時查閱蚪腐。
什么是斷言
作為前端開發(fā),很少去自己寫單元測試篷帅。對于單元測試的了解也很少史侣,自學(xué)了一點(diǎn)關(guān)于單元測試斷言的知識拴泌,有了一些自己的個人理解,記錄下來惊橱,方便下次使用時查閱蚪腐。
當(dāng)你對類,模塊或者方法的可以接受的輸入和輸出有著很明確的定義和認(rèn)識税朴,當(dāng)程序的輸出結(jié)果和輸入不匹配時回季,
你想讓程序有一個明確的返回。比如:我明確地知道1+1=2
,我現(xiàn)在就想知道我輸入1+1
會不會得到2正林。如果不是程序返回一個錯誤泡一。這時候我們通常會使用到斷言。
斷言
就是專門用來驗(yàn)證輸出和期望是否一致的一個工具觅廓。在內(nèi)容的實(shí)現(xiàn)上鼻忠,它是通過比較一個實(shí)際值actual
和一個期望值expected
來實(shí)現(xiàn)的。下面介紹一個使用較為廣泛的斷言庫chai.js
chai.js斷言庫
- 安裝和導(dǎo)入
npm i chai
import chai from 'chai'
let expect = chai.expect;
- 使用
let foo = 'bar';
expect(foo).to.equal('bar');
chai的使用是類似于鏈?zhǔn)秸{(diào)用的形式杈绸。以expect(foo).to.be.a('string');
為例帖蔓,
通過.
我么你可以把這個鏈?zhǔn)椒譃閹讉€部分:
expect(foo)
to
be
-
a('string')
我們逐步來理解這幾個部分:
expect(foo)
:是你要斷言的對象,翻譯過來就是我希望某某某
to
:虛詞瞳脓,單純作為語言鏈提供以期提高斷言的可讀性塑娇,它本身并不具有斷言功能。
be
:同to
一樣劫侧,是語言鏈調(diào)用提高可讀性埋酬。
a(string)
:a(type)
是一個斷言,用來判斷測試紙的類型烧栋。type是被測試值的類型写妥,也就是斷言的期望值。
那么根據(jù)上面的分析劲弦,我們可以知道實(shí)現(xiàn)一個斷言需要這幾個部分:
- 要斷言的對象
- 不具備斷言功能的斷言詞
- 具備斷言功能的斷言詞
- 以及期望結(jié)果
要斷言的對象和期望結(jié)果都是需要根據(jù)實(shí)際輸入和輸出進(jìn)行設(shè)置的。因此我們主要是講解斷言詞醇坝。
不具備斷言功能的斷言詞
- to
- be
- been
- is
- that
- which
- and
- has
- have
- with
- at
- of
- same
- but
- does
- still
這些斷言詞其實(shí)沒有意義邑跪,你把它去掉也不受到影響。比如:
expect(foo).to.equal('bar');
expect(foo).equal('bar');
上面兩個斷言能夠?qū)崿F(xiàn)相同的功能呼猪。也就是說這些詞語使不使用沒什么影響画畅。
接下來說一下具備斷言功能的斷言詞。
具備斷言功能的斷言詞
-
equal
equal
是一個基本上萬能的斷言詞宋距,絕大多數(shù)的斷言都可以轉(zhuǎn)換成使用equal
來實(shí)現(xiàn)轴踱。
比如判斷變量長度是否為3,我們可以使用lengthOf
,同樣可以使用equal
實(shí)現(xiàn)
expect(foo).have.lengthOf(3);
expect(foo.length).equal(3)谚赎;
比如判斷數(shù)據(jù)類型:我們既可以使用a
淫僻,同樣可以使用equal
實(shí)現(xiàn)
expect(foo).to.be.a('string');
expect(typeof foo).to.equal('string');
-
.deep
deep
主要是用來遞歸比較對象的鍵值對诱篷,而不是比較對象本身。通常配合equal
和property
進(jìn)行使用雳灵。
比如:
expect([1,2]).equal([1,2]) // 斷言不通過
上面的斷言無法通過棕所,因?yàn)橐妙愋偷谋容^的是對象。接下來我們看使用deep
expect([1,2]).deep.equal([1,2]) // 斷言通過
也就是說如果是數(shù)組悯辙,對象等引用類型時琳省,要比較里面的值需要使用deep
。
通過使用equal
和deep
我們基本上能夠?qū)崿F(xiàn)絕大多數(shù)的斷言躲撰。更多的關(guān)于斷言
可以參考官網(wǎng)
說明
目前只是介紹了expect
的使用针贬,其實(shí)chai.js
還有assert
和should
兩種斷言方式被因。
其中expect
主要適用于行為驅(qū)動測試(Behavior Driven Development.BDD)逊朽。其他兩種斷言方式,以后用到了再進(jìn)行介紹毡惜。