Jest 非常擅長在 javascript/typescript 中模擬導入,但我發現很難記住實作細節。
函數和物件需要以不同的方式進行模擬,預設匯出的模擬與命名匯出略有不同,且 Jest 與打字稿的配合效果不佳。將所有這些事情結合起來,可能很難找出甚至搜尋適合您的模擬場景的正確方法。
我建立本指南是為了回答這個問題「如何模擬我的導入?」無論導入是什麼。預設或命名、函數或物件。
我的環境
我已經使用以下版本的軟體測試了所有這些方法:
- 節點 v22.11.0
- 笑話 v29.7.0
- ts-jest v29.2.5
- @types/jest v29.5.14
使用預設的最小 jest.config.js 檔案:
export default { testEnvironment: 'node', transform: { '^.+.tsx?$': ['ts-jest', {}], }, testMatch: ['**/*.test.ts'], };
模擬導入
廣泛常見的導入分為我們可能想要模擬的兩類:
- 功能
- 物體
我們將從函數開始依序解決這兩個問題。
導入函數
從模組導出的函數可以命名或預設。我們會看看兩者。第一:
模擬模組中的命名導出函數
這應該用於模擬模組中的命名導出函數,如下所示:
// ./path/to/module.ts export function doSomething(...) { ... }
可以這樣嘲笑:
import { doSomething } from './path/to/module'; // note: This should be the path to the module from the test file, // NOT from the module that contains the doSomething function itself. jest.mock('./path/to/module', () => ({ doSomething: jest.fn(), })); ... it('should do something', () => { // We need to assert that the function is a jest.Mock // so that typescript will allow us to call mock methods. (doSomething as jest.Mock).mockReturnValue(mockValue); // run your test here expect(doSomething).toHaveBeenCalledTimes(1); // etc. });
模擬從模組返回的預設函數
這應該用於模擬模組預設導出的函數,如下所示:
// ./path/to/module.ts export default function doSomething(...) { ... }
它的模擬方式與命名導出類似:
import doSomething from './path/to/module' jest.mock('./path/to/module', () => ({ __esModule: true, default: jest.fn() })) ... it('should do something', () => { (doSomething as jest.Mock).mockResolvedValue(mockData); // Run your test here expect(doSomething).toHaveBeenCalledTimes(5); });
導入對象
模擬導出的物件(可以是類別、json 物件或其他物件)時需要考慮一些變化。
- 它是命名導出還是預設導出?
- 它有沒有我們也希望模擬的方法,或只是屬性?
沒有方法的模擬預設對象
如果您只需要模擬屬性(例如設定檔),而不是方法,那麼具體做法如下:
import config from '../config'; jest.mock('../config', () => ({ __esModule: true, default: { apiKey: '123MockKey', ... }, })); ... it('Should do something', () => { ... });
如果每次檢定需要改變模擬屬性:
import config from '../config'; const mockConfig = { apiKey: '123MockKey', ... }; jest.mock('../config', () => ({ __esModule: true, default: mockConfig, })); ... beforeEach(() => { // restore defaults before each test mockConfig.apiKey = '123MockKey'; ... }); it('Should do something', () => { mockConfig.apiKey = 'new value'; // rest of the test }); // more tests
模擬沒有方法的命名導出對象
與模擬預設導出物件非常相似:
import { config } from '../config'; const mockConfig = { apiKey: '123MockKey', ... }; jest.mock('../config', () => ({ config: mockConfig, })); // the rest is exactly the same as when mocking a default export object.
使用方法模擬對象
當從模組導出(命名或預設)帶有方法的物件時,我們需要模擬這些方法的輸出,方法略有不同。
上課:
// ./path/to/module.ts class ComplicatedThing { // properties, fields, constructor etc. go here getData() { ... } ... } // note: I don't necessarily recommend exporting an instance // of a class like this - purely illustrative for testing purposes. // https://medium.com/@lazlojuly/are-node-js-modules-singletons-764ae97519af export const complicatedThing = new ComplicatedThing(...);
並模擬我們匯出的物件:
export default { testEnvironment: 'node', transform: { '^.+.tsx?$': ['ts-jest', {}], }, testMatch: ['**/*.test.ts'], };
模擬預設導出物件是完全相同的,除了我們定義模擬時:
// ./path/to/module.ts export function doSomething(...) { ... }
獎勵:模擬物件上的方法作為參數直接傳遞給測試函數/類
這是為了模擬一個對象,該對像不是直接導入到您正在測試的模組中,而是作為參數傳遞給類別/函數。
注意:如果您正在模擬一個類,您可能想要建立一個介面並建立該介面的模擬實作以傳遞到您的函數/類中。這將使您無需進行如下不優雅的類型斷言惡作劇。
import { doSomething } from './path/to/module'; // note: This should be the path to the module from the test file, // NOT from the module that contains the doSomething function itself. jest.mock('./path/to/module', () => ({ doSomething: jest.fn(), })); ... it('should do something', () => { // We need to assert that the function is a jest.Mock // so that typescript will allow us to call mock methods. (doSomething as jest.Mock).mockReturnValue(mockValue); // run your test here expect(doSomething).toHaveBeenCalledTimes(1); // etc. });
// ./path/to/module.ts export default function doSomething(...) { ... }
import doSomething from './path/to/module' jest.mock('./path/to/module', () => ({ __esModule: true, default: jest.fn() })) ... it('should do something', () => { (doSomething as jest.Mock).mockResolvedValue(mockData); // Run your test here expect(doSomething).toHaveBeenCalledTimes(5); });
結論
我希望這對你有用,也對我未來的自己有用,當我下次努力記住如何在打字稿中模擬導入的細節時。
我希望它能滿足您所有簡單的模擬需求,並為您在模擬更複雜的導入時提供一個起點。
感謝您的閱讀。
以上是用 Jest 和 typescript 進行嘲笑 - 備忘錄的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript字符串替換方法詳解及常見問題解答 本文將探討兩種在JavaScript中替換字符串字符的方法:在JavaScript代碼內部替換和在網頁HTML內部替換。 在JavaScript代碼內部替換字符串 最直接的方法是使用replace()方法: str = str.replace("find","replace"); 該方法僅替換第一個匹配項。要替換所有匹配項,需使用正則表達式並添加全局標誌g: str = str.replace(/fi

因此,在這裡,您準備好了解所有稱為Ajax的東西。但是,到底是什麼? AJAX一詞是指用於創建動態,交互式Web內容的一系列寬鬆的技術。 Ajax一詞,最初由Jesse J創造

本文討論了在瀏覽器中優化JavaScript性能的策略,重點是減少執行時間並最大程度地減少對頁面負載速度的影響。

本文討論了使用瀏覽器開發人員工具的有效JavaScript調試,專注於設置斷點,使用控制台和分析性能。

將矩陣電影特效帶入你的網頁!這是一個基於著名電影《黑客帝國》的酷炫jQuery插件。該插件模擬了電影中經典的綠色字符特效,只需選擇一張圖片,插件就會將其轉換為充滿數字字符的矩陣風格畫面。快來試試吧,非常有趣! 工作原理 插件將圖片加載到畫布上,讀取像素和顏色值: data = ctx.getImageData(x, y, settings.grainSize, settings.grainSize).data 插件巧妙地讀取圖片的矩形區域,並利用jQuery計算每個區域的平均顏色。然後,使用

本文將引導您使用jQuery庫創建一個簡單的圖片輪播。我們將使用bxSlider庫,它基於jQuery構建,並提供許多配置選項來設置輪播。 如今,圖片輪播已成為網站必備功能——一圖胜千言! 決定使用圖片輪播後,下一個問題是如何創建它。首先,您需要收集高質量、高分辨率的圖片。 接下來,您需要使用HTML和一些JavaScript代碼來創建圖片輪播。網絡上有很多庫可以幫助您以不同的方式創建輪播。我們將使用開源的bxSlider庫。 bxSlider庫支持響應式設計,因此使用此庫構建的輪播可以適應任何

數據集對於構建API模型和各種業務流程至關重要。這就是為什麼導入和導出CSV是經常需要的功能。在本教程中,您將學習如何在Angular中下載和導入CSV文件


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。