Typescript 測試驅(qū)動開發(fā) TDD (9)
匹配器 (Matchers)
1. toBe
Jest 使用所謂的匹配器來將測試中的預期值與接收到的值進行匹配。讓我們快速看一下其中一些匹配器,如下所示:
1 it("should match with toBe", () => { 2 expect(1).toBe(2); 3 });
在這里,我們使用toBe匹配器來測試值1是否與值2相同。顯然,這個測試將會失敗,并顯示以下消息:
expect(received).toBe(expected) // Object.is equality Expected: 2 Received: 1
在這里,我們可以看到Jest期望值為2,但實際接收到的是1。有趣的是,這條消息中toBe匹配器使用了Object.is相等性。這意味著以下測試將通過:
1 it("should match with toBe using assignment", () => { 2 let objA = {id: 1}; 3 let objB = objA; 4 expect(objA).toBe(objB); 5 });
在這里,我們正在創(chuàng)建一個名為objA的對象實例,并將其值分配給另一個名為objB的變量。這意味著變量objA和objB都指向內(nèi)存中的同一個對象。我們可以嘗試使用toBe匹配器來比較兩個不同的對象,如下所示:
1 it("should match with toBe", () => { 2 let objA = {id: 1}; 3 let objB = {id: 1}; 4 expect(objA).toBe(objB); 5 });
在這里,objA和objB具有相同的結(jié)構(gòu),并且它們具有相同的值,但它們不是內(nèi)存中的同一個對象。這個測試將產(chǎn)生以下測試失?。?/span>
expect(received).toBe(expected) //Object.is equality
If it should pass with deep equality, replace "toBe" with
"toStrictEqual"
Expected: {"id": 1}
Received: serializes to the same string
2. toEqual
在這里,我們可以看到我們的測試失敗了,因為objA和objB是兩個不同的對象。Jest的錯誤輸出也建議我們將toBe替換為toStrictEqual。然而,我們可以使用toEqual匹配器來達到相同的結(jié)果,如下所示:
1 it("should match with toEquala", () => { 2 let objA = {id: 1}; 3 let objB = {id: 1}; 4 expect(objA).toEqual(objB); 5 });
在這里,我們的測試通過了,因為toEqual匹配器會正確地將兩個對象的形狀和值解釋為相等。
3. toContain和 toContainEqual
Jest還提供了許多變體的toContain匹配器,用于測試一個值是否包含在另一個值中,如下所示:
1 it("should contain a value", () => { 2 expect("abcde").toContain("cde"); 3 });
在這里,我們的測試期望值 "abcde" 包含值 "cde"。我們也可以將這個概念應用到數(shù)組上,如下所示:
1 it("should contain an array item", () => { 2 let objArray = [ 3 {id: 1}, 4 {id: 2} 5 ]; 6 7 expect(objArray).toContainEqual({id: 2}) ; 8 });
在這里,我們有一個名為objArray的對象數(shù)組,并且我們的測試期望objArray數(shù)組應該包含值{id: 2}。請注意,在這種情況下,我們使用了toContainEqual匹配器,用于檢查數(shù)組是否包含特定項。
4. not
請注意,使用not屬性可以對任何期望進行反轉(zhuǎn),如下所示:
1 it("should not contain a value", () => { 2 expect("abcde").not.toContain("123"); 3 });
在這里,我們期望值 "abcde" 不包含值 "123"。
Jest的所有匹配器都可以使用not屬性作為前綴,以測試不相等性。
5. toThowError
匹配器還具有在拋出錯誤時進行測試的能力。考慮以下函數(shù):
1 function throwError() { 2 throw new Error("this is an error"); 3 }
在這里,我們有一個名為throwsError的函數(shù),它會拋出一條帶有消息"this is an error"的錯誤。我們可以編寫一個測試來驗證是否會拋出該錯誤,如下所示:
1 it("should throw an error", () => { 2 expect( 3 () => {throwError() } 4 ).toThrowError(new Error("this is an error")); 5 });
在這里,我們有一個使用名為 toThrowError 的匹配器的測試,用于測試函數(shù) throwsError 是否確實拋出了錯誤,并且錯誤消息是正確的。
請注意,在 expect 中我們提供了一個調(diào)用 throwsError 函數(shù)的匿名函數(shù)。當測試是否會拋出錯誤時,我們必須將調(diào)用拋出錯誤的函數(shù)包裝在一個匿名函數(shù)中,否則測試本身將無法正確執(zhí)行。

浙公網(wǎng)安備 33010602011771號