Changesets 源代碼中的 Logger 包提供了有關(guān)在測試中靜默日志消息的文檔。這讓我想知道變更集是如何做到這一點(diǎn)的,并讓我研究了它的源代碼。
變更集存儲庫搜索靜默日志
我使用 Github 搜索在 Changesets 存儲庫中搜索了臨時(shí) SilenceLogs。
讓我選擇暫時(shí)搜索SilenceLogs的原因是Logger中提到了它
包自述文件。
import { temporarilySilenceLogs } from "@changesets/test-utils"; import { log } from "@changesets/logger"; temporarilySilenceLogs(); // Now the logs in this test file are not actually logged to std out log("I am not logged"); // Use console.log to log messages in tests if required console.log("Yay, I am logged");
當(dāng)你嘗試?yán)斫庠创a時(shí),可以使用文檔作為起點(diǎn),搜索變量和函數(shù),為你在處理像 Changesets 這樣的大型項(xiàng)目時(shí)設(shè)定探索的方向。
暫時(shí)沉默日志
以下代碼摘自Changesets源代碼。
此函數(shù)接受一個(gè)函數(shù)作為參數(shù),然后使用名為 createLogSilencer 的函數(shù)使日志靜音。
注意這里的設(shè)置功能:
const dispose = silencer.setup(); try { await testFn(); } finally { dispose(); }
createLogSilencer
以下代碼選自變更集
const createLogSilencer = () => { const originalLoggerError = logger.error; const originalLoggerInfo = logger.info; const originalLoggerLog = logger.log; const originalLoggerWarn = logger.warn; const originalLoggerSuccess = logger.success; const originalConsoleError = console.error; const originalConsoleInfo = console.info; const originalConsoleLog = console.log; const originalConsoleWarn = console.warn; const originalStdoutWrite = process.stdout.write; const originalStderrWrite = process.stderr.write; return { setup() { logger.error = jest.fn(); logger.info = jest.fn(); logger.log = jest.fn(); logger.warn = jest.fn(); logger.success = jest.fn(); console.error = jest.fn(); console.info = jest.fn(); console.log = jest.fn(); console.warn = jest.fn(); process.stdout.write = jest.fn(); process.stderr.write = jest.fn(); return () => { logger.error = originalLoggerError; logger.info = originalLoggerInfo; logger.log = originalLoggerLog; logger.warn = originalLoggerWarn; logger.success = originalLoggerSuccess; console.error = originalConsoleError; console.info = originalConsoleInfo; console.log = originalConsoleLog; console.warn = originalConsoleWarn; process.stdout.write = originalStdoutWrite; process.stderr.write = originalStderrWrite; }; }, }; };
這里發(fā)生了什么?
- 作業(yè)
const originalLoggerError = logger.error; const originalLoggerInfo = logger.info; const originalLoggerLog = logger.log; const originalLoggerWarn = logger.warn; const originalLoggerSuccess = logger.success; const originalConsoleError = console.error; const originalConsoleInfo = console.info; const originalConsoleLog = console.log; const originalConsoleWarn = console.warn; const originalStdoutWrite = process.stdout.write; const originalStderrWrite = process.stderr.write;
2.返回設(shè)置
如果您注意到上面的內(nèi)容,setup 會在臨時(shí)SilenceLogs 中調(diào)用,這是由 createLogSilencer 返回的
return { setup() { logger.error = jest.fn(); logger.info = jest.fn(); logger.log = jest.fn(); logger.warn = jest.fn(); logger.success = jest.fn(); console.error = jest.fn(); console.info = jest.fn(); console.log = jest.fn(); console.warn = jest.fn(); process.stdout.write = jest.fn(); process.stderr.write = jest.fn(); return () => { logger.error = originalLoggerError; logger.info = originalLoggerInfo; logger.log = originalLoggerLog; logger.warn = originalLoggerWarn; logger.success = originalLoggerSuccess; console.error = originalConsoleError; console.info = originalConsoleInfo; console.log = originalConsoleLog; console.warn = originalConsoleWarn; process.stdout.write = originalStdoutWrite; process.stderr.write = originalStderrWrite; }; }, };
設(shè)置功能發(fā)生了什么?
2.1 記錄器和控制臺 API 初始化為 jest.fn()
logger.error = jest.fn(); logger.info = jest.fn(); logger.log = jest.fn(); logger.warn = jest.fn(); logger.success = jest.fn(); console.error = jest.fn(); console.info = jest.fn(); console.log = jest.fn(); console.warn = jest.fn(); process.stdout.write = jest.fn(); process.stderr.write = jest.fn();
這幾乎使日志保持沉默,因?yàn)楫?dāng)您使用任何記錄器時(shí)都會調(diào)用 jest.fn(),因此這被視為設(shè)置,是使日志保持沉默的重要步驟。
2.2 setUp 返回原始記錄器
如果你注意到了,函數(shù)調(diào)用的順序是
a. const Silencer = createLogSilencer();
b. const dispose = Silencer.setup();
c.在finally 塊中。
try { await testFn(); } finally { dispose(); }
dispose 由 createLogSilencer 返回的 setup 函數(shù)返回。此步驟將在執(zhí)行測試函數(shù)后恢復(fù)日志記錄機(jī)制。
關(guān)于我們:
在 Thinkthroo,我們研究大型開源項(xiàng)目并提供架構(gòu)指南。我們開發(fā)了使用 Tailwind 構(gòu)建的可重用組件,您可以在項(xiàng)目中使用它們。我們提供 Next.js、React 和 Node 開發(fā)服務(wù)。
與我們預(yù)約會面討論您的項(xiàng)目。
參考資料:
https://github.com/changesets/changesets/tree/main/packages/logger#silencing-messages-in-tests
https://github.com/search?q=repo:changesets/changesets 暫時(shí)SilenceLogs &type=code
https://github.com/changesets/changesets/blob/baf56448606e005577dbe2fb1e78ff457dcaaefd/scripts/test-utils/src/index.ts#L16
以上是如何在測試中暫時(shí)靜音日志的詳細(xì)內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣服圖片

Undresser.AI Undress
人工智能驅(qū)動的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover
用于從照片中去除衣服的在線人工智能工具。

Clothoff.io
AI脫衣機(jī)

Video Face Swap
使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的代碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級代碼編輯軟件(SublimeText3)

javascriptisidealforwebdevelogment,whilejavasuitslarge-scaleapplicationsandandandroiddevelopment.1)javascriptexceleatingingingingingingingbeatingwebexperienceswebexperienceswebexperiencesandfull-stackdeevermentwithnode.js.2)

在JavaScript中,選擇單行注釋(//)還是多行注釋(//)取決于注釋的目的和項(xiàng)目需求:1.使用單行注釋進(jìn)行快速、內(nèi)聯(lián)的解釋;2.使用多行注釋進(jìn)行詳細(xì)的文檔說明;3.保持注釋風(fēng)格的一致性;4.避免過度注釋;5.確保注釋與代碼同步更新。選擇合適的注釋風(fēng)格有助于提高代碼的可讀性和可維護(hù)性。

是的,javascriptcommentsarenectary和shouldshouldshouldseffectional.1)他們通過codeLogicAndIntentsgudedepleders,2)asevitalincomplexprojects,和3)handhanceClaritywithOutClutteringClutteringThecode。

Java和JavaScript是不同的編程語言,各自適用于不同的應(yīng)用場景。Java用于大型企業(yè)和移動應(yīng)用開發(fā),而JavaScript主要用于網(wǎng)頁開發(fā)。

JavascriptconcommentsenceenceEncorenceEnterential gransimenting,reading and guidingCodeeXecution.1)單inecommentsareusedforquickexplanations.2)多l(xiāng)inecommentsexplaincomplexlogicorprovideDocumentation.3)

評論arecrucialinjavascriptformaintainingclarityclarityandfosteringCollaboration.1)heelpindebugging,登機(jī),andOnderStandingCodeeVolution.2)使用林格forquickexexplanations andmentmentsmmentsmmentsmments andmmentsfordeffordEffordEffordEffordEffordEffordEffordEffordEddeScriptions.3)bestcractices.3)bestcracticesincracticesinclud

JavaScripthasseveralprimitivedatatypes:Number,String,Boolean,Undefined,Null,Symbol,andBigInt,andnon-primitivetypeslikeObjectandArray.Understandingtheseiscrucialforwritingefficient,bug-freecode:1)Numberusesa64-bitformat,leadingtofloating-pointissuesli

JavaScriptIspreferredforredforwebdevelverment,而Javaisbetterforlarge-ScalebackendsystystemsandSandAndRoidApps.1)JavascriptexcelcelsincreatingInteractiveWebexperienceswebexperienceswithitswithitsdynamicnnamicnnamicnnamicnnamicnemicnemicnemicnemicnemicnemicnemicnemicnddommanipulation.2)
