Zar*_*old 5 javascript node.js typescript jestjs
__filename和__dirname是输入代码的绝对文件路径。根据 Node.js 文档(并已确认),这 2 个特殊的全局变量是被注入的,而不是成为对象的一部分,global因此无法通过globalThis/global在笑话中进行配置。
示例函数:utils.ts
export const getFileAndDirName = () => ({
relevantFile: __filename.split('/')?.[3],
rootPath: __dirname,
})
Run Code Online (Sandbox Code Playgroud)
不起作用的示例测试代码:utils.test.ts
it('finds the file path where the function was executed', () => {
globalThis.__filename = '/Users/me/work/utils/index.ts'
expect(getFileAndDirName()).toEqual('utils')
globalThis.__filename = '/Users/me/work/tests/index.ts'
expect(getFileAndDirName()).toEqual('tests')
})
Run Code Online (Sandbox Code Playgroud)
替代方案/解决方法:
我知道我可以重构我的代码以便仍然能够测试它:
export const safelyExtractThirdElement = (filePath = '') => filePath.split('/')?.[3]
export const getFileAndDirName = () => ({
relevantFile: safelyExtractThirdElement(__filename),
rootPath: __dirname,
})
Run Code Online (Sandbox Code Playgroud)
这个解决方案使我能够避免嘲笑__filename......但是理想情况下,我不需要更改我的实际代码并保持私有内部实用程序未经测试,而且与我自己的示例相比,这也是一个简化的任意示例。
我也可以破解我的代码以使其正常工作,但我认为测试应该使代码更强大而不是更黑客:
__filename = globalThis.__filename || __filename // will probably work since globalThis.__filename is never defined.
Run Code Online (Sandbox Code Playgroud)
是否有一些理想/不太理想的策略来开玩笑地嘲笑这些特殊变量?
真正的问题是是否可以模拟__dirname,或者__filename我是否应该接受这些可能不会被模拟节点笑话并规避该限制?
背景:__文件名,__目录名
事实上,这不起作用并不让我感到惊讶:如果我们查看 Node.js 文档,__filename它清楚地表明 __filename 和 __dirname 您可能认为是全局变量,但事实并非如此。
__dirname#
This variable may appear to be global but is not. See __dirname.
__filename#
This variable may appear to be global but is not. See __filename.
Run Code Online (Sandbox Code Playgroud)
https://nodejs.org/api/globals.html#__dirname
(function(exports, require, module, __filename, __dirname) {
// Module code actually lives in here
});
Run Code Online (Sandbox Code Playgroud)
问题是,如果可能的话,如何用玩笑模拟 __filename 或 __dirname。Jest 文档非常清楚地说明了如何使用 globalThis 来模拟和临时设置函数,但是这些非全局全局变量又如何呢?
| 归档时间: |
|
| 查看次数: |
1212 次 |
| 最近记录: |